这是y.out文件的一部分
状态65
15表达式:表达式。"&&"表达式
16|表达式。"<"表达式
17|表达式。"+"表达式
18|表达式。"-"表达式
19|表达式。"*"表达式
20|表达式。"["Expression"]"
21|表达式。"."长度"
22|表达式。"."标识符"("表达式","表达式")"
25|"!"表达式。
"[" shift, and go to state 67
"<" shift, and go to state 69
"+" shift, and go to state 70
"-" shift, and go to state 71
"*" shift, and go to state 72
"." shift, and go to state 73
"[" [reduce using rule 25 (Expression)]
"<" [reduce using rule 25 (Expression)]
"+" [reduce using rule 25 (Expression)]
"-" [reduce using rule 25 (Expression)]
"*" [reduce using rule 25 (Expression)]
"." [reduce using rule 25 (Expression)]
$default reduce using rule 25 (Expression)
这就是如何设置操作员的优先级
%left "&&"
%left '<'
%left '-' '+'
%left '*'
%right '!'
%left '.'
%left '(' ')'
%left '[' ']'
在野牛中,"x"
和'x'
之间存在差异;它们不是同一个标记。因此,假设您使用的是bison,那么您的优先级声明不会引用产品中的终端。
Bison还允许%token
定义以下形式:
%token name quoted-string ...
例如(从野牛自己的语法文件中摘录的一小段):
%token
PERCENT_CODE "%code"
PERCENT_DEBUG "%debug"
PERCENT_DEFAULT_PREC "%default-prec"
PERCENT_DEFINE "%define"
PERCENT_DEFINES "%defines"
PERCENT_ERROR_VERBOSE "%error-verbose"
一旦符号被别名化,它们就可以在语法中互换使用,从而使在生成中使用双引号字符串成为可能;有些人觉得这样的语法更容易阅读。但是,没有任何机制可以确保lexer为双引号字符串生成正确的令牌编号,因为它只能访问令牌名称。
"原始"yacc,至少在Thomas Dickey维护的当前"byacc"版本中,允许单引号和双引号的令牌名称,但不区分它们;CCD_ 4和CCD_。它也没有提供任何简单的别名令牌名称的方法,因此双引号多字符字符串不是特别容易以可靠的方式使用。