예제 #1
0
 def Cmd(self):
     noCmd = No()
     tempToken = Token(self.token.getNome(), self.token.getLexema(),
                       self.token.getLinha(), self.token.getColuna())
     # Cmd -> CmdIF
     if (self.token.getNome() == Tag.KW_IF):
         self.CmdIf()
     # Cmd -> CmdWhile
     elif (self.token.getNome() == Tag.KW_WHILE):
         self.CmdWhile()
     # Cmd -> CmdWrite
     elif (self.token.getNome() == Tag.KW_WRITE):
         self.CmdWrite()
     # Cmd -> ID CmdAtribFunc
     elif (self.eat(Tag.ID)):
         if (self.ts.getTipo(tempToken.getLexema()) == None):
             self.sinalizaErroSemantico('ID não declarado')
         noCmdAtribuiFunc = self.CmdAtribFunc()
         if (noCmdAtribuiFunc.getTipo() != Tag.TIPO_VAZIO
                 and self.ts.getTipo(
                     tempToken.getLexema()) != noCmdAtribuiFunc.getTipo()):
             self.sinalizaErroSemantico('Atribuição incompatível')
     else:
         self.sinalizaErroSintatico(
             'Esperado "if , while , write , id", encontrado ' + '"' +
             self.token.getLexema() + '"')
예제 #2
0
    def Classe(self):
        # Classe -> class ID : ListaFuncao Main end .
        if (self.eat(Tag.KW_CLASS)):
            tempToken = Token(self.token.getNome(), self.token.getLexema(),
                              self.token.getLinha(), self.token.getColuna())

            if (not self.eat(Tag.ID)):
                self.sinalizaErroSintatico('Esperado "ID", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            else:
                self.ts.setTipo(tempToken.getLexema(), Tag.TIPO_VAZIO)
            if (not self.eat(Tag.KW_DBL_SCORE)):
                self.sinalizaErroSintatico('Esperado ":", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            self.ListaFuncao()
            self.Main()
            if (not self.eat(Tag.KW_END)):
                self.sinalizaErroSintatico('Esperado "end", encontrado ' +
                                           '"' + self.token.getLexema() + '"')
            if (not self.eat(Tag.KW_SCORE)):
                self.sinalizaErroSintatico('Esperado ".", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
        else:
            self.sinalizaErroSintatico('Esperado "class", encontrado ' + '"' +
                                       self.token.getLexema() + '"')
예제 #3
0
 def Arg(self):
     noTP = self.TipoPrimitivo()
     tempToken = Token(self.token.getNome(), self.token.getLexema(),
                       self.token.getLinha(), self.token.getColuna())
     if (not self.eat(Tag.ID)):
         self.sinalizaErroSintatico('Esperado "ID", encontrado ' + '"' +
                                    self.token.getLexema() + '"')
     else:
         self.ts.setTipo(tempToken.getLexema(), noTP.getTipo())
예제 #4
0
 def DeclaraID(self):
     #DeclaraID -> TipoPrimitivo ID ;
     noTP = self.TipoPrimitivo()
     tempToken = Token(self.token.getNome(), self.token.getLexema(),
                       self.token.getLinha(), self.token.getColuna())
     if (not self.eat(Tag.ID)):
         self.sinalizaErroSintatico('Esperado "ID", encontrado ' + '"' +
                                    self.token.getLexema() + '"')
     else:
         self.ts.setTipo(tempToken.getLexema(), noTP.getTipo())
     if (not self.eat(Tag.KW_SCORE_COMMA)):
         self.sinalizaErroSintatico('Esperado ";", encontrado ' + '"' +
                                    self.token.getLexema() + '"')
예제 #5
0
 def Main(self):
     tempToken = Token(self.token.getNome(), self.token.getLexema(),
                       self.token.getLinha(), self.token.getColuna())
     # Main -> defstatic void main ( String [ ] ID ) : RegexDeclaraId ListaCmd end ;
     if (self.eat(Tag.KW_DEFSTATIC)):
         if (not self.eat(Tag.KW_VOID)):
             self.sinalizaErroSintatico('Esperado "void", encontrado ' +
                                        '"' + self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_MAIN)):
             self.sinalizaErroSintatico('Esperado "main", encontrado ' +
                                        '"' + self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_OPN_PARENTH)):
             self.sinalizaErroSintatico('Esperado "(", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_STRING)):
             self.sinalizaErroSintatico('Esperado "String", encontrado ' +
                                        '"' + self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_OPN_MATTR)):
             self.sinalizaErroSintatico('Esperado "[", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_CLS_MATTR)):
             self.sinalizaErroSintatico('Esperado "]", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         if (not self.eat(Tag.ID)):
             self.sinalizaErroSintatico('Esperado "ID", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         else:
             self.ts.setTipo(tempToken.getLexema(), Tag.STRING)
         if (not self.eat(Tag.KW_CLS_PARENTH)):
             self.sinalizaErroSintatico('Esperado ")", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_DBL_SCORE)):
             self.sinalizaErroSintatico('Esperado ":", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
         self.RegexDeclaraId()
         self.ListaCmd()
         if (not self.eat(Tag.KW_END)):
             self.sinalizaErroSintatico('Esperado "end", encontrado ' +
                                        '"' + self.token.getLexema() + '"')
         if (not self.eat(Tag.KW_SCORE_COMMA)):
             self.sinalizaErroSintatico('Esperado ";", encontrado ' + '"' +
                                        self.token.getLexema() + '"')
     else:
         self.sinalizaErroSintatico('Esperado "defstatic", encontrado ' +
                                    '"' + self.token.getLexema() + '"')
예제 #6
0
    def Funcao(self):
        #Funcao -> def TipoPrimitivo ID ( ListaArg ) : RegexDeclaraId ListaCmd Retorno end ;
        if (self.eat(Tag.KW_DEF)):
            noTP = self.TipoPrimitivo()
            tempToken = Token(self.token.getNome(), self.token.getLexema(),
                              self.token.getLinha(), self.token.getColuna())
            if (not self.eat(Tag.ID)):
                self.sinalizaErroSintatico('Esperado "ID", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            else:
                self.ts.setTipo(tempToken.getLexema(), noTP.getTipo())
            if (not self.eat(Tag.KW_OPN_PARENTH)):
                self.sinalizaErroSintatico('Esperado "(", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            self.ListaArg()
            if (not self.eat(Tag.KW_CLS_PARENTH)):
                self.sinalizaErroSintatico('Esperado ")", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            if (not self.eat(Tag.KW_DBL_SCORE)):
                self.sinalizaErroSintatico('Esperado ":", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
            self.RegexDeclaraId()
            self.ListaCmd()

            noReturn = self.Retorno()
            if (noReturn.getTipo() != noTP.getTipo()):
                self.sinalizaErroSemantico('Tipo de retorno incompativel')
            if (not self.eat(Tag.KW_END)):
                self.sinalizaErroSintatico('Esperado "end", encontrado ' +
                                           '"' + self.token.getLexema() + '"')
            if (not self.eat(Tag.KW_SCORE_COMMA)):
                self.sinalizaErroSintatico('Esperado ";", encontrado ' + '"' +
                                           self.token.getLexema() + '"')
        else:
            self.sinalizaErroSintatico('Esperado "def", encontrado ' + '"' +
                                       self.token.getLexema() + '"')