def readIdent (self, lexer) :
result = lexer.tokenText
if not lexer.isIdentifier () :
lexer.error ("Identifier expected")
lexer.nextToken ()
return result
def parseItem (self, lexer) :
if lexer.isIdentifier () :
result = lexer.tokenText
lexer.nextToken ()
elif lexer.isNumber () :
result = lexer.tokenText
lexer.nextToken ()
elif lexer.isSeparator ('(') :
lexer.checkSeparator ('(')
result = self.parseExpr ()
lexer.checkSeparator (')')
else :
lexer.error ("Identifier or number expected")
return result
def parseFactor (self, lexer) :
result = self.parseItem (lexer)
while lexer.isSeparator ("*") or lexer.isSeparator ("/") :
arit = lexer.tokenText
lexer.nextToken () # skip + or -
b = self.parseItem (lexer)
result = result + " " + arit + " " + b
return result
def parseExpr (self, lexer) :
result = self.parseFactor (lexer)
while lexer.isSeparator ("+") or lexer.isSeparator ("-") :
arit = lexer.tokenText
lexer.nextToken () # skip + or -
b = self.parseFactor (lexer)
# a = a + b
result = "(" + result + ") " + arit + " (" + b + ")"
return result
self.put ("expression " + a )
# simple statements
def readIdent (self, lexer) :
result = lexer.tokenText
if not lexer.isIdentifier () :
lexer.error ("Identifier expected")
lexer.nextToken ()
return result
def parseItem (self, lexer) :
if lexer.isIdentifier () :
result = lexer.tokenText
lexer.nextToken ()
elif lexer.isNumber () :
result = lexer.tokenText
lexer.nextToken ()
else :
lexer.error ("Identifier or number expected")
return result
def parseExpr (self, lexer) :
a = self.parseItem (lexer)
if lexer.isSeparator ("+") :
lexer.nextToken () # skip +
b = self.parseItem (lexer)
# a = a + b
a = a + " + " + b
return a
self.put ("expression " + a )
def parseSimpleStat (self, lexer) :
a = self.parseExpr (lexer)
lexer.checkSeparator ('=')
b = self.parseExpr (lexer)
lexer.checkSeparator (';')
self.put ("simple " + a + " = " + b)
def parseWhile (self, lexer) :
self.openBranch ("while")
self.setLine (lexer)
lexer.checkKeyword ("while")
lexer.checkSeparator ('(')
self.parseExpr (lexer)
lexer.checkSeparator (')')
self.parseStat (lexer)
self.closeBranch ()
def parseIf (self, lexer) :
self.openBranch ("if")
self.setLine (lexer)
lexer.checkKeyword ("if")
lexer.checkSeparator ('(')
self.parseExpr (lexer)
lexer.checkSeparator (')')
self.openBranch ("then")
self.parseStat (lexer)
self.closeBranch ()
if lexer.isKeyword ("else") :
lexer.nextToken () # preskoc else
self.openBranch ("else")
self.parseStat (lexer)
self.closeBranch ()
self.closeBranch ()
def parseCompoundStat (self, lexer) :
lexer.checkSeparator ("{")
while not lexer.isSeparator ("}") :
self.parseStat (lexer)
lexer.checkSeparator ("}")
def parseStat (self, lexer) :
if lexer.isKeyword ("if") :
self.parseIf (lexer)
elif lexer.isKeyword ("while") :
self.parseWhile (lexer)
elif lexer.isSeparator ("{") :
self.parseCompoundStat (lexer)
else :
self.parseSimpleStat (lexer)