1

如果我定义 aLexical来提供 a TokenParser,那么我将无法TokenParser真正输出EOF令牌。特别是Parser[T]( acceptIf, acceptMatch, 和phrase) 中的某些方法直接检查是否Reader是,因此在返回错误之前atEnd没有机会将令牌添加到令牌流中。EOF

由于Tokens特征实际上定义了一个EOF标记,我确信必须有一些简单的方法来输出它,但在这一点上,我能想到的就是创建我自己的,直到至少一个之后才会Reader返回输出或向输入添加一个字符,这样直到它发出该字符后才意识到它已经结束。trueatEndEOF'\032'Reader

请告诉我我错过了一个更简单的方法......

4

1 回答 1

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))
}
于 2013-05-28T15:20:35.883 回答