3

トークン'for'が解析する言語の2つの異なる状況で使用される場合をどのように処理しますか?次の例のように、ステートメントや「パラメータ」など。

echo for print example
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

出力:

for print example
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

ありがとう。

4

3 に答える 3

1

これを行う方法を確認する唯一の方法は、レクサー文法で、 andを除く他のすべての文字が後に続くEcho文字に一致するルールを定義することです。echo\r\n

Echo
  :  'echo' ~('\r' | '\n')+
  ;

そのルールが、識別子とキーワードに一致するルールの前にあることを確認してください ( などfor)。

可能な開始の簡単なデモは次のとおりです。

grammar Test;

parse
  :  (echo | for)*
  ;

echo
  :  Echo (NewLine | EOF)
  ;

for 
  :  For Identifier In range NewLine
     Do NewLine
     echo
     Done (NewLine | EOF)
  ;

range
  :  '{' Integer '..' Integer ('..' Integer)? '}'
  ;

Echo
  :  'echo' ~('\r' | '\n')+
  ;

For  : 'for';
In   : 'in';
Do   : 'do';
Done : 'done';

Identifier
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

Integer
  :  '0'..'9'+
  ;

NewLine
  :  '\r' '\n'
  |  '\n'
  |  '\r'
  ;

Space
  :  (' ' | '\t') {skip();}
  ;

入力を解析する場合:

echo for print example
for i in {0..10..2}
do
  echo "Welcome $i times"
done
echo the end for now!

それを使用すると、次のようになります。

代替テキスト http://img571.imageshack.us/img571/5713/grammar.png

(画像を少し回転させる必要がありました。そうしないと、まったく表示されません!)

HTH。

于 2010-05-04T07:20:26.640 に答える
0

これを行うには、セマンティック述語を使用して、実際にforキーワードである場合にのみそのレクサールールを取得する必要があります。

詳細は、ANTLRwikiの識別子ページとしてキーワードで入手できます。

于 2010-05-11T22:30:45.610 に答える
-1

とても簡単です。ほとんどの文法は次のようなものを使用します。

TOKEN_REF
    :   'A'..'Z' ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
    ;

したがって、print ステートメントを参照するときは、次のようにします。

'print' (TOKEN_REF)*

また、for ステートメントを使用すると、次のように「for」を明示的に指定するだけです。

'for' INT 'in' SOMETHING
于 2010-04-27T17:23:19.220 に答える