diff --git a/lib/ERMParser.cpp b/lib/ERMParser.cpp index befc1a6ad..cd1674902 100644 --- a/lib/ERMParser.cpp +++ b/lib/ERMParser.cpp @@ -79,15 +79,15 @@ void ERMParser::parseFile() parseLine(lineBuf); } break; - case ERMParser::UNFINISHED_STRING: + case ERMParser::UNFINISHED: { if(!inString) - wholeLine = ""; + wholeLine = " "; inString = true; wholeLine += lineBuf; } break; - case ERMParser::END_OF_STRING: + case ERMParser::END_OF: { inString = false; wholeLine += lineBuf; @@ -289,7 +289,7 @@ namespace ERM struct TSymbol { - boost::optional symModifier; + std::vector symModifier; std::string sym; }; @@ -300,7 +300,7 @@ namespace ERM //v-expression struct TVExp { - boost::optional modifier; + std::vector modifier; std::vector children; }; @@ -577,9 +577,9 @@ namespace ERM } void operator()(TSymbol const& cmd) const { - if(cmd.symModifier.is_initialized()) + BOOST_FOREACH(TVModifier mod, cmd.symModifier) { - tlog2 << cmd.symModifier.get(); + tlog2 << mod << " "; } tlog2 << cmd.sym; } @@ -607,9 +607,9 @@ namespace ERM void printTVExp(const TVExp & exp) { - if(exp.modifier.is_initialized()) + BOOST_FOREACH(TVModifier mod, exp.modifier) { - tlog2 << exp.modifier.get(); + tlog2 << mod << " "; } tlog2 << "[ "; BOOST_FOREACH(TVOption opt, exp.children) @@ -635,6 +635,7 @@ namespace ERM void printAST(const TLine & ast) { boost::apply_visitor(TLPrinterVisitor(), ast); + tlog2 << std::endl; } } @@ -765,13 +766,13 @@ BOOST_FUSION_ADAPT_STRUCT( BOOST_FUSION_ADAPT_STRUCT( ERM::TVExp, - (boost::optional, modifier) + (std::vector, modifier) (std::vector, children) ) BOOST_FUSION_ADAPT_STRUCT( ERM::TSymbol, - (boost::optional, symModifier) + (std::vector, symModifier) (std::string, sym) ) @@ -791,7 +792,7 @@ namespace ERM iexp %= varExp | qi::int_; varp %=/* qi::lit("?") >> */(varExpNotMacro | qMacroUsage); comment %= *qi::char_; - commentLine %= (~qi::char_("!@") >> comment | (qi::char_('!') >> (~qi::char_("?!$#")) >> comment )); + commentLine %= (~qi::char_("!") >> comment | (qi::char_('!') >> (~qi::char_("?!$#[")) >> comment )); cmdName %= qi::lexeme[qi::repeat(2)[qi::char_]]; arithmeticOp %= iexp >> qi::char_ >> iexp; //identifier is usually a vector of i-expressions but VR receiver performs arithmetic operations on it @@ -831,14 +832,14 @@ namespace ERM command | commentLine | spirit::eps ); - vmod %= qi::string("`") | qi::string(",") | qi::string(",@") | qi::string("#'"); - vsym %= -vmod >> qi::lexeme[+qi::char_("+*/$%&_=<>~a-zA-Z0-9-")]; + vmod %= qi::string("`") | qi::string(",!") | qi::string(",") | qi::string("#'"); + vsym %= *vmod >> qi::lexeme[+qi::char_("+*/$%&_=<>~a-zA-Z0-9-")]; qi::real_parser > strict_double; vopt %= qi::lexeme[(qi::lit("!") >> qi::char_ >> qi::lit("!"))] | qi::lexeme[strict_double] | qi::lexeme[qi::int_] | command | vexp | string | vsym; - vexp %= -vmod >> qi::lit("[") >> *(vopt) >> qi::lit("]"); + vexp %= *vmod >> qi::lit("[") >> *(vopt) >> qi::lit("]"); - vline %= (( qi::lit("@") >>vexp) | rline ) > spirit::eoi; + vline %= (( qi::lit("!") >>vexp) | rline ) > spirit::eoi; //error handling @@ -941,28 +942,20 @@ ERMParser::ELineType ERMParser::classifyLine( const std::string & line, bool inS { ERMParser::ELineType ret; if(line[0] == '!') - { + { if(countHatsBeforeSemicolon(line) % 2 == 1) - { - ret = ERMParser::UNFINISHED_STRING; - } + ret = ERMParser::UNFINISHED; else - { ret = ERMParser::COMMAND_FULL; - } } else { if(inString) { if(countHatsBeforeSemicolon(line) % 2 == 1) - { - ret = ERMParser::END_OF_STRING; - } + ret = ERMParser::END_OF; else - { - ret = ERMParser::UNFINISHED_STRING; - } + ret = ERMParser::UNFINISHED; } else { diff --git a/lib/ERMParser.h b/lib/ERMParser.h index 0db4b5a78..18bc7375f 100644 --- a/lib/ERMParser.h +++ b/lib/ERMParser.h @@ -8,7 +8,7 @@ private: int parsedLine; void repairEncoding(char * str, int len) const; //removes nonstandard ascii characters from string void repairEncoding(std::string & str) const; //removes nonstandard ascii characters from string - enum ELineType{COMMAND_FULL, COMMENT, UNFINISHED_STRING, END_OF_STRING}; + enum ELineType{COMMAND_FULL, COMMENT, UNFINISHED, END_OF}; int countHatsBeforeSemicolon(const std::string & line) const; ELineType classifyLine(const std::string & line, bool inString) const; void parseLine(const std::string & line);