[英]What is the problem in this yacc grammar?
我有一个yacc解析器,可以在其中解析“ abc = 123”(VAR = VAR),abc = [1 2 3](VAR = value_series / string)和abc = [[123]]等命令。
我需要解析abc = [xyz = [1 2 3] jkl = [3 4 5]]。由于规则2之间的歧义,此语法失败了(我想,它无法区分value_series和新规则。
我尝试了一个案例:VAR_NAME等价quote_or_brace模型等价quote_or_brace value_series quote_or_brace净等价quote_or_brace value_series quote_or_brace quote_or_brace
没用
series:
| PLUS series
{
}
| series VAR_NAME EQUAL VAR_NAME
{
delete [] $2;
delete [] $4;
}
| series VAR_NAME EQUAL quote_or_brace value_series quote_or_brace
{
delete [] $2;
}
| series VAR_NAME EQUAL quote_or_brace quote_or_brace value_series quote_or_brace quote_or_brace
{
delete [] $2;
}
| error
{
setErrorMsg(string("error"));
YYABORT;
};
如果是我,我可能会写一套类似于以下的规则:
assignment_list
: assignment
| assignment assignment_list
;
assignment
: VAR_NAME '=' assignment_rhs
;
assignment_rhs
: expression
| '[' opt_expression_list ']' /* allows var1 = [ ... ] */
;
opt_expression_list
: /* empty */
| expression_list
;
expression_list
: expression
| expression expression_list
;
expression
: VAR_NAME /* a variable name, as in var1 = var2 */
| NUMBER /* some kind of number, as in var1 = 123 */
| STRING /* quoted string, as in var1 = "foo" */
| assignment /* allows nesting of assignments, as in var1 = [var2 = 4] */
/* also allows things like var1 = var2 = 123 */
;
请注意,无论如何都不会对此进行测试,并且我不确定从expression
到assigment
的递归。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.