Lex/Yacc Flex/Bison:在多个产生式规则中重复使用标记的优先级

4
我是一个简单表达式编译器的开发者,但我卡在了如何使用Bison的优先级关键字上。
在我的词法分析器中,我定义了以下检查:
'-'     {ECHO;return(MINUS);}

然而,我注意到在评估表达式时,“-”有两种含义,1)用于减法和2)用于对数字进行否定,并且两者具有不同的优先级。

在我的解析器文件中,如何使用%left和%right来定义结合性来解决这个问题?

我知道我可以这样做

%left PLUS
%left MINUS
... and so on

对于每个这样的标记,但由于否定具有右结合性和更高的优先级,我该如何在此处包含它,因为我认为我不能这样做

%left PLUS
%left MINUS
%right MINUS /* This is the negation one */

感谢您的帮助!

1
你看过这个吗:https://dev59.com/CGTWa4cB1Zd3GeqPB0xW? - ZivS
没有,我没有看到那个。谢谢! - Nice-kun
1个回答

4
引用自http://dinosaur.compilertools.net/yacc/
[...] 一元运算符通常需要指定优先级。有时,一元运算符和二元运算符具有相同的符号表示,但是它们的优先级不同。一个例子就是一元和二元的“-”;一元负号可以被赋予与乘法相同的强度,甚至更高,而二元减号的强度低于乘法。关键字%prec可以改变特定语法规则相关联的优先级级别。%prec出现在语法规则体之后、动作或结束分号之前,并且后面跟着一个令牌名称或文字。它会使得语法规则的优先级变为以下标记名称或文字的优先级。例如,为了让一元负号具有与乘法相同的优先级,规则可能如下所示:
    %left  '+'  '-'
    %left  '*'  '/'

    %%

    expr    :       expr  '+'  expr
            |       expr  '-'  expr
            |       expr  '*'  expr
            |       expr  '/'  expr
            |       '-'  expr      %prec  '*'
            |       NAME
            ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接