我在使用(可重入)Flex + Lemon进行解析时遇到了问题。我使用了一个简单的语法和lexer here。当我运行它时,我将输入一个数字,后跟一个EOF标记(Ctrl-D)。打印输出将显示:
89
found int of .
AST=0.
其中第一行是我输入的数字。理论上,AST值应该是我输入的所有内容的总和。
EDIT:手动调用Parse()时运行正常
另外,即使token为0(停止token),lemon似乎也会运行atom ::= INT
规则。为什么会这样?我对这种行为感到非常困惑,我找不到任何好的文档。
2条答案
按热度按时间de90aj5v1#
好吧,我想通了。原因是flex和lemon之间发生了一种特别讨厌的(而且记录得很差的)交互。
为了保存内存,lemon会保留一个token而不复制,并将其推送到内部token堆栈。然而,flex也会尝试通过更改
yyget_text
在lexes输入时指向的值来节省内存。我的示例中的违规行是:这应该是:
这将确保lemon在以后减少令牌堆栈时指向的值与您最初传入的值相同。
(Note:不要忘记,
strdup
意味着你必须在以后的某个时候释放内存。Lemon将允许你编写可以做到这一点的令牌“析构函数”,或者如果你正在构建一个AST树,你应该等到AST生命周期结束。)piwo6bdm2#
你也可以尝试创建一个标记类型,它包含一个指向字符串的指针 * 和字符串的长度 *。
token.h
main.c
language.y(节选)
language.l(节选)
看到我的printf语句了吗?我用字符串和长度来打印我的标记。