From ef4d3182766034709fd9924690848dae3fb386f5 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 30 Aug 2013 12:15:30 -0700 Subject: [PATCH] Entities - Added parser support for @entities, by merely allowing them to exist as terminals. - Added sample entities. - Extended grammar to test entities. --- src/parser/Parser.cpp | 3 ++- src/parser/bnf.cpp | 5 ++++- src/parser/grammar.bnf | 16 +++++++++------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/parser/Parser.cpp b/src/parser/Parser.cpp index 5429dd5a8..1ae580ff8 100644 --- a/src/parser/Parser.cpp +++ b/src/parser/Parser.cpp @@ -191,7 +191,8 @@ void Parser::checkConsistency () // Undefined value - these are definitions that appear in token, but are // not in _rules. for (unsigned int i = 0; i < notDefined.size (); ++i) - throw std::string ("definition '") + notDefined[i] + "' referenced, but not defined."; + if (notDefined[i][0] != '@') + throw std::string ("definition '") + notDefined[i] + "' referenced, but not defined."; // Circular definitions - these are names in _rules that also appear as // token 0 in any of the alternates for that definition. diff --git a/src/parser/bnf.cpp b/src/parser/bnf.cpp index 2e99adddf..2a138c6cf 100644 --- a/src/parser/bnf.cpp +++ b/src/parser/bnf.cpp @@ -80,6 +80,7 @@ int main (int argc, char** argv) else if (grammarFile == "") { grammarFile = argv[i]; + std::cout << "INFO: Using grammar file " << grammarFile << "\n"; } else { @@ -104,13 +105,15 @@ int main (int argc, char** argv) if (verbose) p.verbose (); // TODO Initialize entity lists. - p.addEntity ("report", "list"); + p.addEntity ("report", "list"); + p.addEntity ("writecmd", "modify"); // Load and verify grammar. p.grammar (grammar); if (verbose) p.dump (); // Either returns a parse-tree or throws. + std::cout << "INFO: Parsing <" << commandLine << ">\n"; Tree* t = p.parse (commandLine); if (t) { diff --git a/src/parser/grammar.bnf b/src/parser/grammar.bnf index b2956a867..68c09a11e 100644 --- a/src/parser/grammar.bnf +++ b/src/parser/grammar.bnf @@ -15,15 +15,15 @@ ; all-commands ::= report-command - | read-command -# | write-command - | special-command +# | read-command + | write-command +# | special-command ; report-command ::= filter @report ; - read-command ::= filter @readcmd ; -# write-command ::= filter @writecmd modifiers ; - special-command ::= ; +# read-command ::= filter @readcmd ; + write-command ::= filter @writecmd modifiers ; +# special-command ::= ; filter ::= expression? ; @@ -32,7 +32,9 @@ | term ; -# modifiers ::= ; + term ::= ; + + modifiers ::= ; # Low-level: