3

C のような言語を lex (その後、解析) しようとしています。C では、改行が重要なプリプロセッサ ディレクティブがあり、実際のコードでは改行が単なる空白です。

これを行う 1 つの方法は、初期の C コンパイラのような 2 パス プロセスを実行することです。# ディレクティブ用に別のプリプロセッサを用意し、その出力を lex します。

しかし、単一のレクサーでそれが可能かどうか疑問に思いました。StdLexicalscala パーサーとコンビネーターのコードを書くことにはかなり満足していますが、 が空白をどのように処理するかについてはよくわかりません。

#include改行を使用して行をレックスし、改行を無視していくつかの簡単なコードを書くことができると言う単純なサンプルコードを誰かが書くことができますか? それとも、これは不可能であり、2 パスアプローチを使用する方がよいでしょうか?

4

1 に答える 1

7

OK、これを自分で解決しました。後世のためにここに答えてください。

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
 }
于 2010-04-14T12:41:34.887 に答える