0

这是 y.ouput 文件的一部分

状态 65

15 表达式:表达式。“&&“ 表达

16 | 表达 。“<”表达式

17 | 表达 。“+”表达式

18 | 表达 。“-“ 表达

19 | 表达 。“*“ 表达

20 | 表达 。“[“ 表达 ”]”

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 '[' ']'
4

1 回答 1

0

在野牛中, 和 之间是有区别"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"

一旦符号被别名化,它们就可以在语法中互换使用,从而可以在产生式中使用双引号字符串;有些人发现这样的语法更容易阅读。但是,没有机制可以确保词法分析器为双引号字符串生成正确的标记号,因为它只能访问标记名称。

“原始” yacc,至少在 Thomas Dickey 维护的当前“byacc”版本中,允许单引号和双引号令牌名称,但不区分它们;两者"+"'+'映射到标记号 43 ('+')。它也没有提供任何简单的方法来为令牌名称取别名,因此双引号多字符串并不是特别容易以可靠的方式使用。

于 2013-09-05T14:57:53.687 回答