我正在尝试为迷你 Java 构建一个解析器,我在表达式语法部分得到了 shift/reduce 冲突。我无法解决此冲突



这是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_。它也没有提供任何简单的别名令牌名称的方法,因此双引号多字符字符串不是特别容易以可靠的方式使用。

相关内容

  • 没有找到相关文章

最新更新