prekl:mini_parser
Příklad syntaktického analyzátoru
Příklad ručně psaného syntaktického analyzátoru, který rozpoznává jednoduché příkazy.
Na místě výrazů dovoluje pouze identifikátory.
Funkce openBranch, closeBranch a put zobrazují výsledky ve stromu.
Funkce setLine uloží do stromu číslo právě zpracovávané řádky zdrojového textu. (Kliknutí do stromu zvýrazní zdrojovou řádku.)
Používáme již dříve popsaný lexikální analyzátor lexer
def readIdent (self, lexer) : result = lexer.tokenText if not lexer.isIdentifier () : lexer.error ("Identifier expected") lexer.nextToken () return result def parseExpr (self, lexer) : a = self.readIdent (lexer) self.put ("expression " + a ) def parseSimpleStat (self, lexer) : a = self.readIdent (lexer) lexer.checkSeparator ('=') b = self.readIdent (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 parseStat (self, lexer) : if lexer.isKeyword ("if") : self.parseIf (lexer) elif lexer.isKeyword ("while") : self.parseWhile (lexer) else : self.parseSimpleStat (lexer)
Literatura: http://homepages.cwi.nl/~steven/pascal/book/2syntax.html
prekl/mini_parser.txt · Last modified: 2025/03/16 14:01 by 2a00:1028:919d:bcb2:da5e:d3ff:fe59:4914