如何解决解决简单 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 举报,一经查实,本站将立刻删除。