在scala StdLexical中编辑新词?

在scala StdLexical中编辑新词?,scala,newline,lexer,parser-combinators,Scala,Newline,Lexer,Parser Combinators,我正在尝试lex(然后解析)一种类似C的语言。在C语言中,有一些预处理器指令,其中换行符很重要,而实际代码中的换行符只是空白 实现这一点的一种方法是像早期的C编译器一样执行两个过程——为#指令使用单独的预处理器,然后对其输出进行lex处理 然而,我想知道是否有可能在一个单一的lexer。我对编写scala解析器组合器代码非常满意,但我不太确定StdLexical如何处理空白 是否有人可以编写一些简单的示例代码,比如说可以包含一行(使用换行符)和一些琐碎的代码(忽略换行符)?或者这是不可能的,最好

我正在尝试lex(然后解析)一种类似C的语言。在C语言中,有一些预处理器指令,其中换行符很重要,而实际代码中的换行符只是空白

实现这一点的一种方法是像早期的C编译器一样执行两个过程——为#指令使用单独的预处理器,然后对其输出进行lex处理

然而,我想知道是否有可能在一个单一的lexer。我对编写scala解析器组合器代码非常满意,但我不太确定
StdLexical
如何处理空白


是否有人可以编写一些简单的示例代码,比如说可以包含一行(使用换行符)和一些琐碎的代码(忽略换行符)?或者这是不可能的,最好采用2次通过的appproach?

好的,我自己解决了这个问题,在这里为后代回答

在StdLexical中,您已经能够在lexer中指定空白。您所要做的就是适当地重写您的令牌方法。下面是一些示例代码(删除了不相关的位)

override def token:CeeLexer.Parser[token]=controlLine
// | ... (其中…是原始方法中您想要保留的内容)
def controlLine=hashInclude
def hashInclude:CeeLexer.Parser[hashInclude]=
(“#”~word(“include”)~rep(nonEolws)~'\'''~rep(chrExcept('\'','\n',EofCh))~'\'-'\n'|
“#”~word(“include”)~rep(nonEolws)~''''.\n',EofCh)~'>'.''.\n')^^{
case hash~include~whs~openQ~fname~closeQ~eol=>//要处理的代码#include
}
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
 }