我正在尝试lex(然后解析)一种C语言。在C中有预处理器指令,其中换行符很重要,然后是实际代码,它们只是空格。
这样做的一种方法是做一个像早期C编译器这样的两遍过程 - 为#directives分别有一个预处理器,然后把它的输出作为lex。
但是,我想知道是否可以在一个词法分析器中完成它。我很高兴编写scala解析器 - 组合器代码,但我不太确定StdLexical
如何处理空格。
有人可以编写一些简单的示例代码,说明可以使用#include
行(使用换行符)和一些简单的代码(忽略换行符)吗?或者这是不可能的,最好选择2-pass appproach?
答案 0 :(得分:7)
好的,我自己解决了这个问题,回答这里的后代。
在StdLexical中,您已经能够在词法分析器中指定空格。您所要做的就是适当地覆盖您的令牌方法。这是一些示例代码(删除了非相关位)
override def token: CeeLexer.Parser[Token] = controlLine
// | ... (where ... is whatever you want to keep of the original method)
def controlLine = hashInclude
def hashInclude : CeeLexer.Parser[HashInclude] =
('#' ~ word("include") ~ rep(nonEolws)~'\"' ~ rep(chrExcept('\"', '\n', EofCh)) ~ '\"' ~ '\n' |
'#' ~ word("include") ~ rep(nonEolws)~'<' ~ rep(chrExcept('>', '\n', EofCh)) ~ '>' ~ '\n' ) ^^ {
case hash~include~whs~openQ~fname~closeQ~eol => // code to handle #include
}