如何检测ml-lex中的eof

时间:2011-01-31 18:55:40

标签: sml

在ml-lex中编写代码时 我们需要编写来编写eof函数 val eof = fn () => EOF; 这是写作的必要部分 另外,如果我希望我的词法分析器停止检测eof那么我应该添加到给定的函数中。 感谢。

1 个答案:

答案 0 :(得分:2)

Roger Price的User’s Guide to ML-Lex and ML-Yacc非常适合学习ml-lex和ml-yacc。

eof函数在lex定义的用户声明部分中必须与lexresult类型一起强制执行:

  

当输入结束时,词法分析器调用函数eof   流已到达。

如果适用于您的应用程序或EOF令牌,您的eof函数可以抛出异常。无论如何,它必须返回lexresult类型的东西。用户指南的第7.1.2章中有一个示例,如果EOF位于块注释的中间,则会打印字符串。

我使用了一些“更简单”的eof函数

structure T = Tokens
structure C = SourceData.Comments

fun eof data =
if C.depth data = 0 then
    T.EOF (~1, ~1)
else
  fail (C.start data) "Unclosed comment"

其中C结构是一个“特殊”注释处理结构,用于计算开始和结束注释的数量。如果当前深度为0,则返回EOF标记,其中使用(~1,~1)表示左右位置。由于我没有将此位置信息用于EOF,我只需将其设置为(~1,~1)。

通常,您将设置%eop(解析结束)以使用yacc文件中的EOF标记,以指示所使用的开始符号,可能后跟EOF标记。还记得向%noshift添加EOF。对于%eop和%noshift,请参见第9.4.5节。

显然,您必须在yacc文件aswel的%term声明中定义EOF。

希望这会有所帮助,否则请查看以ml-lex和ml-yacc编写的MLB parserSML parser。 MLB解析器是最简单的,因此可能更容易理解。