2016-05-24 2 views
2

私は最近、最初のプログラミング言語を設計し始めました。すでにJavaに慣れ親しんでいるので、自分の言語用のAST APIをJavaで構築し始めました。私はJavaバイトコードにコンパイルすることを計画しており、それは機能しており、実装したASTの現在の部分で作業しています。私はパーサージェネレーター、特にJavaCCに遭遇する前に、いくつかの異なる構文解析メソッド(すべて失敗した)を試しました。私はJavaCCとEBNFの基本的な研究を行ってきましたが、JavaCCが自分の言語を解析しながら完全なカスタムAST API(コンストラクタ引数などを含む)をサポートできるかどうか疑問に思っていました。私は深く研究し、JavaCCに関するチュートリアルを見たり読んだりする前に、これをここで尋ねたいと思っていました。私が見たことから、JavaCCはASTをサポートすることができますが、制約が何であるかはわかりません。さらに、JavaCCには独自のAST APIがあることはわかっていますが、私がすでに開発しているAPIに固執したいと思います。JavaCCのカスタムAST?

答えて

4

もちろんです。たとえば、あなたは、ASTの詳細の一部からパーサを隔離するために有用であることができ、この

CommandNode whileCommand() : { 
    ExpressionNode e ; 
    CommandNode doPart ; 
} { 
    <WHILE> e = expression() <DO> 
    doPart = sequence() <ENDWHILE> 
    { return new WhileCommand(e, doPart) ; } 
} 

Builderパターンのような非終端記号を書くことができます。

+0

恐ろしく!ありがとう。先読みはどうですか?私が注釈ノードに到着したと言うと、注釈ノードは次のフィールド/メソッドノードのパラメータですが、それは可能ですか? –

+0

新しい質問をあなたが理解しているかどうか分かりません。私はとにかくそれに答えることを試みるでしょう:意味論的な行為は先読みの間に実行されないので、あなたはあなたのツリービルディングとの相互作用なしにあなたが望むすべての先読みを使うことができます。それが答えることができない場合は、新しい質問として投稿してもらえますか? –

+0

私は、より良い質問は "グローバル変数はありますか"と思っています。それで、JavaCCはグローバル変数をサポートしますか? –