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

Lex priority label opcode priority

我正在使用 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 35,X
    dex
    bne loop

问题是它将匹配标签而不是操作码。 第一个标签规则因为 ':' 而起作用,但第二个标签规则优先于操作码规则。

有没有办法让标签的第二种情况起作用(bne 循环)?

提前致谢。

我对 lex 还很陌生。

确保操作码规则出现在包罗万象的标识符规则之前。如果两个规则都适用于最长的匹配标记,(f)lex 生成的扫描器会选择源中的第一个。

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


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

像您所做的那样,在令牌中包含冒号可防止用户在标签名称和 : 之间放置空格,但这可能是您的意图。在某些语法中,双标记标签定义导致语法为 LR(2) 而不是 LR(1).

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