我正在为表达式创建一个简单的编译器,但是我很难搞清楚如何使用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 */
感谢您的帮助!
答案 0 :(得分:3)
引自http://dinosaur.compilertools.net/yacc/:
一般来说,一元运营商必须优先考虑。有时,一元运算符和二元运算符具有相同的符号表示,但具有不同的优先级。一个例子是一元和二元' - &#39 ;;一元减去可以给予与乘法相同的强度,或者甚至更高,而二元减去的强度低于乘法。关键字%prec更改与特定语法规则关联的优先级。 %prec紧跟在语法规则的主体之后,在动作或结束分号之前,后跟一个标记名称或文字。它使语法规则的优先级成为以下标记的优先级 名称或文字。例如,要使一元减号具有与乘法相同的优先级,规则可能类似于:
%left '+' '-'
%left '*' '/'
%%
expr : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '-' expr %prec '*'
| NAME
;