规则永远不会减少,了解为什么

穆里洛·内托(Murilo Neto)

我正在学习与YACC一起工作,我真的无法理解一些错误。我想知道为什么当我尝试使用.y文件生成解析器时出现此错误。这是我的.y文件,代表Pascal语言的上下文无关语法:

%%


Program : program ident ';' declaration_opc compound_stmt '.'
    ;

declaration_opc : var declaration_list
    |
    ;

declaration_list : declaration ';' declaration_list 
     | declaration ';'
     ;

declaration : id_list ':' type
    ;

id_list : ident 
   | ident ',' id_list
   ;

type : integer
   | BOOLEAN
   ;

proc_dec : proc_header forward ';'
    | proc_header declaration_list compound_stmt
    | func_header forward ';'
    | func_header declaration_list compound_stmt
    ;

proc_header : procedure ident parametros ';'
    ;

func_header : function ident parametros : type
    ;

parametros : '(' param_list ')' 
    |
    ;

param_list : arg 
    | arg ';' param_list
    ;

arg : id_list ':' type
    | var id_list ':' type
    ;

compound_stmt : begin statement_list end
    ;

statement_list : statement ';' statement_list
    | statement
    ;

statement : ident attrib expression
 | IF expression then statement         
 | IF expression then statement ELSE statement
 | WHILE expression DO statement
 | compound_stmt
 | readln ident
 | writeln print_list
 | 
 ;

print_list : literal print_list2
 | expression print_list2
 ;

print_list2 : ',' print_list 
 | 
 ;

expression : add_expression relop add_expression
 | add_expression
 ;

relop : lessequal
 | '<'
 | '>'
 | moreequal
 | '='
 | notequal
 ;

add_expression : add_expression addop term 
 ;

addop : '+' 
 |  '-'
 | or
 ;

term : term mulop unary_exp 
     |  unary_exp
     ;

mulop : '*' 
  | div
  | mod
  | and
  ;

unary_exp : not unary_exp 
  |  factor
  ;

factor : '(' expression ')'
  |  ident
  |  num
  |  TRUE
  |  FALSE
  ;


%%

而且我总是这样:

byaccj: 19 rules never reduced 
byaccj: 1 shift/reduce conflict.

有什么可能的解决方案?我发现其他人也有同样的错误,但是我找不到对我的问题有用的东西。如果需要更多信息,请提供。我还读到“规则从不减少”错误,这意味着从不使用语法中的某些规则,但是我的规则无法看到这一点。

克里斯·多德

在您的情况下,该规则proc_dec永远不会出现在任何其他规则的右侧,因此永远不会从您开始的符号(Program到达Yacc只是告诉您该规则(以及它使用的所有规则以及其他所有规则)均无法达到。

通常,您希望使用该-v选项来使yacc生成包含y.output有关语法的详细信息文件。该文件将具体告诉您所有冲突和未使用的规则-它们是什么以及如何发生-而消息仅是对问题的摘要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么for(;;)永远不会终止?

来自分类Dev

为什么等待线程不会永远等待

来自分类Dev

为什么这不会永远持续下去?

来自分类Dev

为什么光标永远不会为空?

来自分类Dev

为什么eof()永远不会返回true?

来自分类Dev

为什么while循环永远不会结束?

来自分类Dev

为什么节点程序永远不会终止?

来自分类Dev

为什么“连接”永远不会被触发?

来自分类Dev

为什么我的指令的链接功能永远不会被调用?

来自分类Dev

为什么C ++中的Lambda永远不会DefaultConstructible

来自分类Dev

为什么这个简单的Akka Streams程序永远不会终止?

来自分类Dev

为什么此Haskell代码永远不会终止?

来自分类Dev

为什么执行此块永远不会结束?

来自分类Dev

为什么最后一行永远不会被读取?

来自分类Dev

为什么(!(feof(sp))&& end)永远不会评估为真?

来自分类Dev

为什么vkAcquireNextImageKHR()永远不会阻塞我的线程?

来自分类Dev

为什么对isspace()的调用永远不会返回true?

来自分类Dev

为什么我的委托方法永远不会被调用?

来自分类Dev

为什么这种情况不会永远持续下去?

来自分类Dev

为什么我的变更处理程序永远不会被解雇?

来自分类Dev

为什么这个asyncio.Task永远不会完成取消?

来自分类Dev

为什么我的while(read)与管道循环永远不会结束?

来自分类Dev

为什么(!(feof(sp))&& end)永远不会评估为真?

来自分类Dev

为什么这个 js IF 条件永远不会评估为真?

来自分类Dev

为什么 Mac 应用程序永远不会“关闭”?

来自分类Dev

为什么我的 SelectField 和 RadioField 永远不会验证?

来自分类Dev

为什么代码永远不会到达覆盖 OnDrawNode 方法?

来自分类Dev

永远不会应用条件格式设置规则

来自分类Dev

如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

Related 相关文章

  1. 1

    为什么for(;;)永远不会终止?

  2. 2

    为什么等待线程不会永远等待

  3. 3

    为什么这不会永远持续下去?

  4. 4

    为什么光标永远不会为空?

  5. 5

    为什么eof()永远不会返回true?

  6. 6

    为什么while循环永远不会结束?

  7. 7

    为什么节点程序永远不会终止?

  8. 8

    为什么“连接”永远不会被触发?

  9. 9

    为什么我的指令的链接功能永远不会被调用?

  10. 10

    为什么C ++中的Lambda永远不会DefaultConstructible

  11. 11

    为什么这个简单的Akka Streams程序永远不会终止?

  12. 12

    为什么此Haskell代码永远不会终止?

  13. 13

    为什么执行此块永远不会结束?

  14. 14

    为什么最后一行永远不会被读取?

  15. 15

    为什么(!(feof(sp))&& end)永远不会评估为真?

  16. 16

    为什么vkAcquireNextImageKHR()永远不会阻塞我的线程?

  17. 17

    为什么对isspace()的调用永远不会返回true?

  18. 18

    为什么我的委托方法永远不会被调用?

  19. 19

    为什么这种情况不会永远持续下去?

  20. 20

    为什么我的变更处理程序永远不会被解雇?

  21. 21

    为什么这个asyncio.Task永远不会完成取消?

  22. 22

    为什么我的while(read)与管道循环永远不会结束?

  23. 23

    为什么(!(feof(sp))&& end)永远不会评估为真?

  24. 24

    为什么这个 js IF 条件永远不会评估为真?

  25. 25

    为什么 Mac 应用程序永远不会“关闭”?

  26. 26

    为什么我的 SelectField 和 RadioField 永远不会验证?

  27. 27

    为什么代码永远不会到达覆盖 OnDrawNode 方法?

  28. 28

    永远不会应用条件格式设置规则

  29. 29

    如果我在脚本中更改用户,为什么运行su的脚本似乎永远不会终止?

热门标签

归档