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)
.
在任何情况下,如果您通过给它一个不同的标记类型来将定义标记为一个定义,您几乎肯定会发现它更简单。
我正在使用 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)
.
在任何情况下,如果您通过给它一个不同的标记类型来将定义标记为一个定义,您几乎肯定会发现它更简单。