2011-08-01 6 views
5

Pythonのように空白のプログラムブロックを表す言語用のコンパイラを作成したいと思います。私はこれをPythonでやっている方が好きですが、C++もオプションです。たとえば、Pythonレクサーのように、インデントとデデントの識別子を正しく生成するなど、これを簡単に行うためのオープンソースのレクサーがありますか?対応するパーサージェネレータはプラスになります。字下げブロックを認識するレクサー

答えて

4

LEPLは純粋なPythonで、オフサイドパーシングをサポートしています。

+0

ありがとうございます。これは私のための完璧なツールのようです。 – Elektito

1

あなたはlexのようなものを使用している場合、あなたは、このようにそれを行うことができます。

^[ \t]+    { int new_indent = count_indent(yytext); 
         if (new_indent > current_indent) { 
          current_indent = new_indent; 
          return INDENT; 
         } else if (new_indent < current_indent) { 
          current_indent = new_indent; 
          return DEDENT; 
         } 
         /* Else do nothing, and this way 
          you can essentially treat INDENT and DEDENT 
          as opening and closing braces. */ 
        } 

あなたは空白行を無視する例えば、少し追加のロジックが必要になる場合があり、かつ自動的にDEDENTを追加します必要に応じてファイルの最後。

おそらくcount_indentは、タブをタブストップ値に従ってスペースに変換することを考慮しています。

私はPythonのlexer/parserジェネレータについて知らないが、私が投稿したものはlex/flexで動作するはずで、yacc/bisonに接続してパーサーを作成することができる。あなたはそれらを使ってCやC++を使うことができます。

+4

1つだけでなく、複数のDEDENTトークンを行の先頭に追加する必要があるかもしれないので、これに注意する必要があります。 Pythonはこれを維持するスタックを持つことを提案しています。 – templatetypedef