diff --git a/examples/peg_peg.py b/examples/peg_peg.py index f12482bf5ea29c825c01f17ecac8f3b47a811677..5245748a91401ad209273b78539c358ee3b65430 100644 --- a/examples/peg_peg.py +++ b/examples/peg_peg.py @@ -16,8 +16,7 @@ from arpeggio.peg import ParserPEG # Semantic actions from arpeggio.peg import SemGrammar, SemRule, SemOrderedChoice, SemSequence,\ - SemPrefix, SemSufix, SemExpression, SemRegEx, SemIdentifier, SemLiteral,\ - SemTerminal + SemPrefix, SemSufix, SemExpression, SemRegEx, SemStrMatch, SemRuleCrossRef sem_actions = { "grammar": SemGrammar(), @@ -28,29 +27,26 @@ sem_actions = { "sufix": SemSufix(), "expression": SemExpression(), "regex": SemRegEx(), - "identifier": SemIdentifier(), - "literal": SemLiteral() + "str_match": SemStrMatch(), + "rule_crossref": SemRuleCrossRef() } -for sem in ["LEFT_ARROW", "SLASH", "STAR", "QUESTION", "PLUS", "AND", "NOT", - "OPEN", "CLOSE"]: - sem_actions[sem] = SemTerminal() - # PEG defined using PEG itself. peg_grammar = r""" - grammar <- rule+ EndOfFile; - rule <- identifier LEFT_ARROW ordered_choice ';'; + grammar <- rule+ EOF; + rule <- rule_name LEFT_ARROW ordered_choice ';'; ordered_choice <- sequence (SLASH sequence)*; sequence <- prefix+; prefix <- (AND/NOT)? sufix; sufix <- expression (QUESTION/STAR/PLUS)?; - expression <- regex / (identifier !LEFT_ARROW) - / ("(" ordered_choice ")") / literal; + expression <- regex / rule_crossref + / (OPEN ordered_choice CLOSE) / str_match; - identifier <- r'[a-zA-Z_]([a-zA-Z_]|[0-9])*'; + rule_name <- r'[a-zA-Z_]([a-zA-Z_]|[0-9])*'; + rule_crossref <- rule_name; regex <- 'r\'' r'(\\\'|[^\'])*' '\''; - literal <- r'\'(\\\'|[^\'])*\'|"[^"]*"'; + str_match <- r'\'(\\\'|[^\'])*\'|"[^"]*"'; LEFT_ARROW <- '<-'; SLASH <- '/'; AND <- '&'; @@ -78,7 +74,7 @@ PMDOTExporter().exportFile(parser.parser_model, # using PEG itself. parser.parse(peg_grammar) -# Again we export parse tree in dot file for vizualization. +# Again we export parse tree in dot file for visualization. PTDOTExporter().exportFile(parser.parse_tree, "peg_peg_parse_tree.dot") @@ -95,4 +91,3 @@ PMDOTExporter().exportFile(asg, # parse PEG grammars parser.parser_model = asg parser.parse(peg_grammar) -