一千萬個為什麽

搜索

翻譯scala StdLexical的新行?

我正在嘗試lex(然後解析)一種C語言。在C中有預處理器指令,其中換行是重要的,然後是實際代碼,它們只是空格。

這樣做的一種方法是做一個像早期C編譯器這樣的兩遍過程 - 對#指令有一個單獨的預處理器,然後是它的輸出。

但是,我想知道是否可以在一個詞法分析器中完成它。我很高興編寫scala解析器 - 組合器代碼,但我不太確定 StdLexical 如何處理空格。

有人可以編寫一些簡單的示例代碼,說明可以使用 #include 行(使用換行符)和一些簡單的代碼(忽略換行符)?或者這是不可能的,最好選擇2-pass appproach?

最佳答案

好的,我自己解決了這個,回答這裏的後代。

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

轉載註明原文: 翻譯scala StdLexical的新行?