解决简单 Yacc 语法中的 reduce/reduce 冲突

如何解决解决简单 Yacc 语法中的 reduce/reduce 冲突

我想知道如何解决下面语法中的reduce/reduce 冲突。有问题的规则是:LDA HASH 表达式 - 当我删除它时,冲突就会消失。我曾尝试将 LDA xxx 解析规则分解为单独的规则,但我仍然遇到冲突。这个规则到底有什么问题,我该如何解决

%%

program:
        program statement NEWLINE               {  }
        |
        ;

statement:
        instruction                             {
                                                    printf("Opcode: %c Address Mode: %d Operand: %d\n",opcode[0],address_mode,operand);
                                                    numInstructions++;
                                                }
        | assignment                            { 
                                                
                                                }
        ;
        
instruction: ADC expression                     {
                                                
                                                }
            | CLC                               { 
                                                    address_mode = IMPLIED_MODE;
                                                    opcode[0] = 0x18;
                                                    fwrite(opcode,1,output);
                                                }
                                                
            | CLD                               { 
                                                    address_mode = IMPLIED_MODE;
                                                    opcode[0] = 0xd8;
                                                    fwrite(opcode,output);
                                                }
                                                
            | LDA expression                    {   
                                                    opcode[0] = 0xad;
                                                }

            | LDA HASH expression               {
                                                    opcode[0] = 0xa9;
                                                    address_mode = IMMEDIATE_MODE;
                                                    if( operand > 255 ) {
                                                        printf("Syntax error. Immediate value too large. The value must lie in the range between 0..255. Line: %d\n",yylineno-1);
                                                        exit(1);
                                                    }
                                                
                                                }
            
            | LDA expression COMMA IDENTIFIER   {
                                                    // LDA operand,x | LDA operand,y
                                                    opcode[0] = 0xbd;
                                                }

                                                
            | STA expression                    { 
                                                
                                                }
            
            | RTS                               { 
                                                    address_mode = IMPLIED_MODE;
                                                    opcode[0] = 0x60; 
                                                    fwrite(opcode,output); 
                                                }
            ;

expression: number                              {   $$ = $1; 
                                                    operand = $1;
                                                    
                                                }
            | HASH number                       { 
                                                    operand = $2;
                                                }
            ;
number:
        NUMBER                                  { $$ = $1; }
        | HEXADECIMAL                           { $$ = $1; }
        | BINARY                                { $$ = $1; }
        ;

assignment:
        IDENTIFIER EQUALS expression            { $$ = $3; }
        ;
%%
 

解决方法

我刚刚发现了语法错误。问题是“表达式:数字”规则部分减少为“哈希数”,导致与“LDA HASH 表达式”规则的减少/减少冲突。解决方法是删除表达式规则中的“HASH number”项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?