我使用lex / yacc编写汇编程序
我有一些操作码,例如
ORA [Oo][Rr][Aa]
AND [Aa][Nn][Dd]
EOR [Ee][Oo][Rr]
和规则
{ORA} { yylval.iValue = ora; return OPCODE; }
{AND} { yylval.iValue = and; return OPCODE; }
{EOR} { yylval.iValue = eor; return OPCODE; }
我也有标签规则
[A-Za-z_][A-Za-z0-9_]*: { yylval.sIndex = AddSymbol(yytext); return SYMBOL; }
[A-Za-z_][A-Za-z0-9_]* { yylval.sIndex = AddSymbol(yytext); return SYMBOL; }
labels in the syntax can be
ldx #$FF
loop:
sta $5535,X
dex
bne loop
问题是它会匹配标签而不是操作码。 第一个标签规则有效,因为':'但第二个标签规则主张操作码规则。
我有没有办法让第二个案例到标签上工作(循环)?
提前致谢。
我是lex的新手。
答案 0 :(得分:1)
确保操作码规则位于catch-all标识符规则之前。如果两个规则都适用于最长匹配的令牌,(f)lex生成的扫描器选择源中的第一个。
定义不会改变规则的优先级。重要的是规则本身的顺序。
顺便说一句,您可能想要考虑将:
作为一个令牌,而不是将loop
的两个实例(一个定义和另一个定义使用)合并到同一个令牌类型中
在令牌中包含冒号,可以防止用户在标签名称和:之间添加空格,但这可能是您的意图。在一些语法中,双标记标签定义导致语法为LR(2)
而不是LR(1)
。
在任何情况下,如果您通过为其定义不同的令牌类型将定义标记为定义,您几乎肯定会发现它更简单。