我正在使用野牛来构建用于教育目的的解析器。这是我非常简单的语法:
program: KW_VAR ident {printf("var %s\n", $2);} ;
ident:
| IDENTIFIER OP_PLUS IDENTIFIER {sprintf($$, "%s + %s\n", $1, $3);}
;
Run Code Online (Sandbox Code Playgroud)
其中KW_VAR代表单词“ var”,OP_PLUS代表运算符“ +”。
var hello + hi是此语法可接受的短语。因此,当我使用上面的代码时,一切正常,printf给出:var hello + hi按预期。但是,当我尝试更改sprintf中$ 1,$ 3的顺序时,如下所示,printf给出:var hi + hi +。我期望的是var hi + hello。
program: KW_VAR ident {printf("var %s\n", $2);} ;
ident:
| IDENTIFIER OP_PLUS IDENTIFIER {sprintf($$, "%s + %s\n", $3, $1);}
;
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?我的代码有问题吗?