自从现在我一直坚持这一点。我想分析简单的东西如:柠檬LALR解析器的简单语法
喜欢:字词1字词2 .. wordN HATES:字词1字词2 .. wordN
我使用柠檬+ Flex的。目前我的语法看起来像这样:
%left LIKES MOODS FROM HATES INFO.
%syntax_error {
std::cout << "Syntax error!" << std::endl;
}
final ::= likes_stmt.
final ::= hates_stmt.
likes_stmt ::= LIKES list(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
hates_stmt ::= HATES list(A). { Data *data=Data::getInstance();data->hates.push_back(A);}
list ::= likes_stmt VALUE(A). { Data *data=Data::getInstance();data->likes.push_back(A);}
list ::= hates_stmt VALUE(A). { Data *data=Data::getInstance();data->hates.push_back(A); }
list(A) ::= VALUE(B). {A=B;}
但是,这只适用于前2个单词。很明显,我做错了什么,可能是在递归定义?任何抬头赞赏:)
通常,这样做的方式是首先解析,然后后处理该树以将信息收集到各种类别中。这样你就不会用人造产品(“set_likes”等)来破坏语法,而这些只是工作中的信号来表示“解析”动作。在更复杂的语言中,这些信号大多只会造成悲伤,因为混乱的语法和纠结与工作解析。但是,如果这是*所有* OP需要做的,那么这个答案是好的。 (感谢upvote!) –