Lex优先级标签操作码优先级

时间:2015-02-09 15:35:20

标签: lex

我使用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的新手。

1 个答案:

答案 0 :(得分:1)

确保操作码规则位于catch-all标识符规则之前。如果两个规则都适用于最长匹配的令牌,(f)lex生成的扫描器选择源中的第一个。

定义不会改变规则的优先级。重要的是规则本身的顺序。


顺便说一句,您可能想要考虑将:作为一个令牌,而不是将loop的两个实例(一个定义和另一个定义使用)合并到同一个令牌类型中

在令牌中包含冒号,可以防止用户在标签名称和之间添加空格,但这可能是您的意图。在一些语法中,双标记标签定义导致语法为LR(2)而不是LR(1)

在任何情况下,如果您通过为其定义不同的令牌类型将定义标记为定义,您几乎肯定会发现它更简单。