0

我正在研究编译器实现并希望检查是否已到达文件末尾?

我知道这可以使用 lex 文件中的 yywrap() 函数来完成,但要求是如果 EOF 被显式定义为十六进制值 0x1a,那么我们如何引用它。

例子:

main() { printf("检查 EOF 标记\n"); '0x1a' <-- 实际的 EOF 标记。

我希望上面不是语法错误,而是报错括号不平衡,或者定义错误。

以上可以吗?我的要求只是在解析器中包含 EOF 令牌,不幸的是,到目前为止我还不能这样做:-((,其余的工作将很容易完成,我只需要给出一个规则如:

print    :    print_stmt '(' stmt_valid ')' colon '\n' 
{
    OK do the rest
}
         |    print_stmt '(' stmt_valid ')' colon end_indicator
{
    print error message and close application.
}
4

1 回答 1

3

让您的词法分析器返回 EOF 的标记。

我建议您在两种情况下退回令牌:

  1. getc()返回-1(通常的 EOF 符号)。在这种情况下,将标记文本设为空

  2. getc()返回'\x1a'。在这种情况下,将此字符放入标记文本中。

这使您的语法可以区分这两种情况。

于 2008-12-08T11:01:52.177 回答