我在我的
lex
文件中定义了这些标记:
(?xi:
ADC|AND|ASL|BIT|BRK|CLC|CLD|CLI|CLV|CMP|CPX|
DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|
NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|
SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|
TYA|CPY|DEC|DEX
) {
yylval.str = strdup(yytext);
for(char *ptr = yylval.str; *ptr = tolower(*ptr); ptr++);
return MNEMONIC;
}
[\(\)=Aa#XxYy,:\+\-\<\>] {
return *yytext;
}
\$[0-9a-fA-F]{4} {
yylval.str = strdup(yytext);
return ABSOLUTE;
}
\$[0-9a-fA-F]{2} {
yylval.str = strdup(yytext);
return ZEROPAGE;
}
这就是我在
bison
中解析它们的方式:
expression:
MNEMONIC { statement(0, $1, NULL, "i"); }
| MNEMONIC zp { statement(5, $1, $2, }
;
zp:
ZEROPAGE { $$->str = strdup($1); }
| '>' ABSOLUTE { $$->str = strdup($2); }
| '<' ABSOLUTE { $$->str = strdup($2); }
;
奇怪的是,如果我将最后两部分添加到
zp
规则中,则 MNEMONIC
规则中的 expression
无法正确读取。
如果您未在规则中设置
$$
,bison 将默认使用 $1
的值对其进行初始化。如果 %type
与预期的 $$
不同,就会发生不好的事情。
在您描述的情况下,它可能是与
<
或 >
标记关联的值。由于这些标记未在词法分析器代码中设置 yylval
,因此它将是前一个标记中发生的任何情况 - 在本例中,为 strdup
分配了 MNEMONIC
的字符串。因此,当您分配给 $$->str
时,它会将字符串视为指向相关数据结构的指针,并将用指向正在分配的另一个字符串的指针覆盖字符串中的 4 或 8 个字符。
因此,可能的结果将是一些堆损坏,当您查看它们时,这些损坏将表现为错误/损坏的操作码。