为什么我的解析器在更改另一部分时会错误地读取一部分?

问题描述 投票:0回答:1

我在我的

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 flex-lexer
1个回答
0
投票

如果您未在规则中设置

$$
,bison 将默认使用
$1
的值对其进行初始化。如果
%type
与预期的
$$
不同,就会发生不好的事情。

在您描述的情况下,它可能是与

<
>
标记关联的值。由于这些标记未在词法分析器代码中设置
yylval
,因此它将是前一个标记中发生的任何情况 - 在本例中,为
strdup
分配了
MNEMONIC
的字符串。因此,当您分配给
$$->str
时,它会将字符串视为指向相关数据结构的指针,并将用指向正在分配的另一个字符串的指针覆盖字符串中的 4 或 8 个字符。

因此,可能的结果将是一些堆损坏,当您查看它们时,这些损坏将表现为错误/损坏的操作码。

© www.soinside.com 2019 - 2024. All rights reserved.