我使用 flex 和 bison 编写了一个小汇编程序,它可以在我的机器(ubuntu 10.10)上构建并运行良好。其他人现在正试图在 Arch linux 上构建它,他们安装的 flex 会产生一个不同的 lex.yy.c,它是不匹配的规则。两个版本都报告了相同的lex 2.5.35
版本,但我已经看到我的和 Mac OSX 上的另一个 flex 之间的差异,它没有 grok(?i
模式,所以我不太相信那个版本字符串。
我无权访问远程机器,所以我正在查看远程用户生成的一些 lex --debug 输出。
我的汇编器的完整源代码在 github 上。
这是我的规则的一个片段:
letter [A-Za-z]
digit [0-9]
hexdigit [0-9a-fA-F]
symbolchar {letter}|[\.$_]
symbol {symbolchar}({symbolchar}|{digit})*
gpreg [ABCXYZIJabcxyzij]
xreg SP|PC|EX|POP|PEEK|PUSH|PICK|sp|pc|ex|pop|peek|push|pick
op2 SET|ADD|SUB|MUL|MLI|DIV|DVI|MOD|MDI|AND|[BX]OR|SH[LR]|ASR|IF[BCENGALU]|ADX|SBX|ST[ID]
op2_lc set|add|sub|mul|mli|div|dvi|mod|mdi|and|[bx]or|sh[lr]|asr|if[bcengalu]|adx|sbx|st[id]
op1 JSR|HCF|INT|RFI|IA[GSQ]|HW[NQI]
op1_lc jsr|hcf|int|rfi|ia[gsq]|hw[nqi]
%%
\.set|\.equ return EQU;
:{symbol} { yylval.string = yytext + 1; return LABEL; }
{symbol}: {
yylval.string = yytext;
yytext[strlen(yytext) - 1] = 0;
return LABEL;
}
0x{hexdigit}+ return get_constant();
{digit}+ return get_constant();
{gpreg}|{xreg} { yylval.integer = str2reg(yytext); return REG; }
{op2}|{op2_lc} { yylval.integer = str2opcode(yytext); return OP2; }
{op1}|{op1_lc} { yylval.integer = str2opcode(yytext); return OP1; }
DAT|dat { return DAT; }
{symbol} { yylval.string = yytext; return SYMBOL; }
这是一个示例输入行:
SET A, 0x30 ; 7c01 0030
远程词法分析器正在匹配{symbol}:
A 而不是{gpreg}|{xreg}
. 这可能是因为我的*
定义中有通配符symbol
吗?为什么这适用于我的 flex 而不是远程的?
我本地(良好)构建的 --debug 输出:
--accepting rule at line 52 (" ")
--accepting rule at line 42 ("SET")
--accepting rule at line 52 (" ")
--accepting rule at line 41 ("A")
--accepting rule at line 50 (",")
--accepting rule at line 52 (" ")
--accepting rule at line 39 ("0x30")
--accepting rule at line 52 (" ")
--accepting rule at line 53 ("; 7c01 0030")
--accepting rule at line 50 ("
")
以及来自有问题的远程构建的调试输出(包括 yacc 投诉)。请注意与 'A' 匹配的不同规则:
--accepting rule at line 52 (" ")
--accepting rule at line 42 ("SET")
--accepting rule at line 52 (" ")
--accepting rule at line 34 ("A")
line 4: syntax error
line 3: parse error: bad instruction
line 3: parse error: bad instruction
--accepting rule at line 50 (",")
line 3: parse error: bad instruction
--accepting rule at line 52 (" ")
--accepting rule at line 39 ("0x30")
line 3: parse error: bad instruction
--accepting rule at line 52 (" ")
--accepting rule at line 53 ("; 7c01 0030")
--accepting rule at line 50 ("
")
我应该如何解决这个问题,我可以期待不同的 flex 版本有什么类似的陷阱吗?