在ml-lex中编写代码时
我们需要编写来编写eof函数
val eof = fn () => EOF;
这是写作的必要部分
另外,如果我希望我的词法分析器停止检测eof那么我应该添加到给定的函数中。
感谢。
答案 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 parser或SML parser。 MLB解析器是最简单的,因此可能更容易理解。