Lex / Yacc Flex / Bison:重复使用令牌以获得多个生产规则的优先权

时间:2014-10-24 02:26:38

标签: c bison yacc lex

我正在为表达式创建一个简单的编译器,但是我很难搞清楚如何使用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 个答案:

答案 0 :(得分:3)

引自http://dinosaur.compilertools.net/yacc/

  一般来说,一元运营商必须优先考虑。有时,一元运算符和二元运算符具有相同的符号表示,但具有不同的优先级。一个例子是一元和二元' - &#39 ;;一元减去可以给予与乘法相同的强度,或者甚至更高,而二元减去的强度低于乘法。关键字%prec更改与特定语法规则关联的优先级。 %prec紧跟在语法规则的主体之后,在动作或结束分号之前,后跟一个标记名称或文字。它使语法规则的优先级成为以下标记的优先级   名称或文字。例如,要使一元减号具有与乘法相同的优先级,规则可能类似于:

    %left  '+'  '-'
    %left  '*'  '/'

    %%

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