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() + '"')
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() + '"')
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())
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() + '"')
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() + '"')
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() + '"')