2012-02-13 4 views
3

ANTLRを使用してプログラムをコンパイルしようとしていますが、Javaプログラミング言語をターゲットとして使用していますが、この問題の中核はIntent Regornizerを開発してエラーを修正し、ソースコードが文法に従わない場合は、ソースコード。ANTLRでJavaコードを解析する "必要概念"

int main(){ 
    int a,b; 
    c=20; 
} 

プログラムは変数そのエラーを検出する方法:私はこのようなレクサーとパーサは私が作ったことを前提とソースコードで簡単なコードをコンパイルする方法を見てANTLR上のチュートリアルや書籍の 'C'は以前に宣言したことは知られていませんか?

私はANTLRを使用してコンパイルする方法の指示に従ってそれを適用しようとしましたが、ANTLRジェネレータのコードは、式の文法規則に従っているため有効であると考えられます。実際には変数cは知られていません。

またはオブジェクト指向の概念を実装できる文法の作成方法私はANTLR文法を使ってみましたが、結果はまだOOPの概念を説明していません。

public class Hello { 
} 

public class HelloTwo { 
    Hello hl = new HelloWrong(); 
} 

私がコードをコンパイルすると、その結果は有効です.Grammar.butのように、そのクラスHelloWrongは実際にはnoです。また、私の最初の問題に前の変数を書き込むことにも関連しています。

私の英語で申し訳ありません。 私の問題を助けることができれば幸いです。 ありがとう

答えて

4

'c'が宣言されているかどうかは、文法の一部ではありません。
パーサはAbstract Syntax Treeを出力し、コンパイラはそのASTを受け取り、semantic analysisを実行します。その段階では、「変数cはそのスコープに存在しません」などのコンパイラエラーが生成されます。

ANTLRがあなたのためにASTを生成し、それが完了しました。次の段階(意味解析とコンパイルと実行可能ファイルの生成)は、コンパイラの別の部分によって行われます。


あなたが探している動作を生成するために使用した方法は、各ノードで「セマンティック解析」を実行するASTをトラバースすることです。

PROGRAM 
|- FUNCTION_DEC "main" 
    |- ARGS <none> 
    |- SCOPE 1 
     |- LOCAL_DEC "a", "b" 
     |- EXPRESSION_STMT 
     |- ASSIGNMENT 
      |- VARIABLE "c" 
      |- LITERAL 20 

そして、このような何か行うことができ、意味解析::)
1を追加し、「メイン」ASTは、それを生成するために使用される文法に完全に依存しますが、あなたの最初のプログラムは次のようになりますどのようなものかグローバルにアクセス可能な関数としてシンボルテーブルに追加
2)メイン関数のスコープ内のスコープ1をシンボルテーブル
に追加する3)スコープ1内のローカル変数としてシンボルテーブルに "a"と "b"を追加する
4)スコープ1内の変数 "c"のシンボルテーブルを調べ、失敗し、 "main"の親スコープを見て、失敗し、グローバルスコープを見て、失敗して、生成するエラーメッセージ:変数 'c​​'が見つかりません。

私が知る限り、それはかなり典型的なプロセスです。

+0

Okayyyタスク... 今私はそれを得ました。 ANTLR for.thanks budie ... のように、あなたは私に解決策を教えてくれますか、そのようにするにはどうすればいいですか?または例外のメッセージを他の言語に翻訳する方法は? –

+0

意味解析を行う方法は?さて、私はあなたのためのリンクと少しの概要を追加しましたが、それは少し大きな話題です。一般的に、シンボルテーブルに物を追加し、シンボルテーブルを使用してシンボルを表示します。 – Task

+0

okeタスク.. ありがとう非常に... 文法にJavaのプログラムから追加する方法を知っていますか?たとえば、文法にいくつかのテキストを書き込むためにjavaでプログラムを構築します。テキストエリアのプログラムは、ソースがvariabelを持っている場合、プログラムはソースをスキャンし、次に変数はgrammar.doにautomatichを含めることになります。 –

関連する問題