3

@BartKiers が提案した質問と文法について (ありがとう!)、options出力を次のように指定するブロックを追加しました。

options{
language=Java;
output=AST;
ASTLabelType=CommonTree;
}

ただし、出力にアクセスする方法がわかりませんAST。ツリーをたどり、入力で指定された各操作を処理する必要があります。


ここの例を使用して、値を返すルールを実装しようとしています。ただし、次のエラーが発生しています。

relational    returns [String val]                   
        :  STRINGVALUE ((operator)^ term)?
            {val = $STRINGVALUE.text + $operator.text + $term.text; }
                                    ;

term returns [String rhsOperand]                    
        :  QUOTEDSTRINGVALUE  {rhsOperand = $QUOTEDSTRINGVALUE.text;}
                                    |  NUMBERVALUE               {rhsOperand = $NUMBERVALUE.text; }
                                    | '(' condition ')'
                                     ;

コンパイル エラー:

Checking Grammar RuleGrammarParser.g...
\output\RuleGrammarParser.java:495: cannot find symbol
symbol  : variable val
location: class RuleGrammarParser
            val = (STRINGVALUE7!=null?STRINGVALUE7.getText():null) + (operator8!=null?input.toString(operator8.start,operator8.stop):null) + (term9!=null?input.toString(term9.start,term9.stop):null); 
            ^
\output\RuleGrammarParser.java:612: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (QUOTEDSTRINGVALUE10!=null?QUOTEDSTRINGVALUE10.getText():null);
                    ^
\output\RuleGrammarParser.java:632: cannot find symbol
symbol  : variable rhsOperand
location: class RuleGrammarParser
                    rhsOperand = (NUMBERVALUE11!=null?NUMBERVALUE11.getText():null); 
                    ^
3 errors

これがコンパイラに失敗する理由を理解するのを手伝ってもらえますか?


ペーストビンを追加しました: http://pastebin.com/u1Bv3L0A

4

1 に答える 1

4

セクションに追加output=ASTするだけoptionsでは、AST は作成されませんが、フラットな 1 次元のトークン リストが作成されます。特定のトークンをルート (または子) としてマークするには、少し作業を行う必要があります。

適切なASTを作成し、パーサーが生成するツリーにアクセスする方法を説明するこの回答をチェックしてください(私が言及した回答の方法で)。CommonTree treemain

を安全に削除できることに注意してくださいlanguage=Java;。デフォルトでは、ターゲット言語は Java です (そのままにしておいて害はありません)。

于 2012-03-02T17:01:29.607 に答える