2

ばかげた/基本的な質問をしているかもしれませんが、ANTLR AST の構築について混乱していました。

私が作りたいのは、親ノードで演算子とそのオペランドを子として持つような一種のブール式パーサーです。たとえば、文

( ( ABC & D ) | ( E & ( F | G ) ) )

理想的には

              |
             / \
            /   \
           /     \
          /       \
         &         &
        / \       / \
       /   \     /   \
      /     D   E     |
     /|\             / \
    A B C           /   \
                   F     G 

以下文法より。

grammar Test;

options
{
   language = 'Java';
   output=AST;
}


exp    :    word (expRest^)? | '('! exp ')'! (expRest^)?  ;

expRest :    (('&'|'|'|'!'|'&!'|'|!')^) exp | (('~'^) digit+ exp);
word    :   letter letter* -> ^(letter letter*);
letter  :        '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z';
digit   :    '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9';

問題は、「&」の子としてノードのリスト(配列)として「AB C」を取得していることです。

単一の文字列として制限することは可能ですか??? つまり、「AB C」または別の言い方をすれば、AST のルート ノードに複数の文字を含めることは可能ですか? はいの場合、どうすればそれを達成できますか?

参考までに「リスク要因と現在の経済状況」の構文木を作りたい

PS私も試しました:

word    :   (letter letter*)^ ;

参考までに、私は.NET環境を使用しています。

4

2 に答える 2

3

単語の「グループ」のルートとなる架空のトークンを文法に挿入できます。を接着するのは良い考えではないと思います。おそらく別々に必要なので、一緒Aに接着するのは良い考えではBありませんか?C

私はあなたが何をしようとしているのか本当に理解できなかったので、ここであなたが頭を動かすことができる(しようとする)小さなデモがあります:

grammar BoolExp;

options { 
  output=AST; 
}

tokens {
  MultiWord;
}

parse
  :  booleanExp EOF!
  ;

booleanExp
  :  orExp
  ;

orExp
  :  andExp ('|'^ andExp)*
  ;

andExp
  :  notExp ('&'^ notExp)*
  ;

notExp
  :  '!'^ atom
  |  atom
  ;

atom
  :  '(' booleanExp ')' -> booleanExp
  |  WORD WORD+         -> ^(MultiWord WORD+)
  |  WORD
  ;

WORD
  :  ('a'..'z' | 'A'..'Z')+
  ;

SPACE
  :  (' ' | '\t' | '\r' | '\n'){skip();}
  ;

それからパーサーを生成し、入力を使用してテストする場合:

( ( A B C & D ) | ( E & ( F | G ) ) )

次のASTを取得します。

代替テキスト

.NETターゲットを使用しているとおっしゃっていたため、上記のASTイメージの作成に使用されたDOTファイルを生成する(Java)テストクラスを投稿しませんでした。ご覧になりたい方はコメントを残してください。投稿します。

于 2010-10-25T18:47:17.710 に答える
0

「AB C」を単一のノードとして使用する場合は、次のように文字の間に「 」を含めるように文字を定義します。

letter : character (space character)*;
character : '0'..'9'|'a'..'z'|'A'..'Z';
space : ' ';

文字ノードの子としてスペースが含まれます。

于 2010-10-25T14:18:22.397 に答える