如果我定义一个Lexical
来提供TokenParser
,我就无法让TokenParser
实际输出EOF
令牌。特别是,Parser[T]
(acceptIf
,acceptMatch
和phrase
)中的某些方法会直接检查Reader
是否为atEnd
,所以在返回错误之前,没有机会将EOF
令牌添加到令牌流中。
由于Tokens
特征实际上定义了一个EOF
令牌,我确信必须有一些简单的方法来输出它,但此时我能想到的就是创建我自己的在输出至少一个Reader
之前未向true
返回atEnd
的{{1}},或者在输入中添加EOF
字符,以便{ {1}}直到它发出那个角色之后才意识到它已经结束了。
请告诉我,我错过了一种更简单的方式......
答案 0 :(得分:0)
根本不需要这样做。使用
new YourLexical.Scanner("foo")
创建一个Reader [YourLexical.Token],它将自动响应#atEnd。
然后你可以把这个Reader交给一个TokenParser直接实现你的语法作为输入:
class YourTokenParser ... {
...
def program: Parser[...] = ...
def parse(s: String) =
phrase(program)(new YourLexical.Scanner(s))
}