如何让词法分析器在Scala TokenParser中输出EOF?

时间:2013-02-11 15:21:16

标签: parsing scala

如果我定义一个Lexical来提供TokenParser,我就无法让TokenParser实际输出EOF令牌。特别是,Parser[T]acceptIfacceptMatchphrase)中的某些方法会直接检查Reader是否为atEnd,所以在返回错误之前,没有机会将EOF令牌添加到令牌流中。

由于Tokens特征实际上定义了一个EOF令牌,我确信必须有一些简单的方法来输出它,但此时我能想到的就是创建我自己的在输出至少一个Reader之前未向true返回atEnd的{​​{1}},或者在输入中添加EOF字符,以便{ {1}}直到它发出那个角色之后才意识到它已经结束了。

请告诉我,我错过了一种更简单的方式......

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))
}