Sml 如何检测ml-lex中的eof

Sml 如何检测ml-lex中的eof,sml,Sml,在用ml-lex编写代码时 我们需要写来写eof函数 val-eof=fn()=>eof 这是写作的必要部分吗 另外,如果我希望我的lexer在检测到eof时停止,那么我应该向给定的函数添加什么。 谢谢。罗杰·普莱斯(Roger Price)的作品非常适合学习ml lex和ml yacc eof函数在lex定义的用户声明部分以及lexresult类型中是必需的,如下所示: 当输入结束时,lexer调用函数eof 到达溪流 其中,如果适用于应用程序或eof令牌,eof函数可以引发异常。无论如何,它

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

罗杰·普莱斯(Roger Price)的作品非常适合学习ml lex和ml yacc

eof函数在lex定义的用户声明部分以及lexresult类型中是必需的,如下所示:

当输入结束时,lexer调用函数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标记。还要记住将EOF添加到%noshift。有关%eop和%noshift,请参见第9.4.5节

显然,您还必须在yacc文件的%术语声明中定义EOF

希望这能有所帮助,否则请看一看用MLLex和MLYACC编写的或。MLB解析器是最简单的,因此可能更容易理解