3

ANTLR グラマーを定義しました。

grammar test5;

stats_statement
:   
    STATS IDENT ASSIGN_SYM functions_stats

;

functions_stats 

:   COUNT LPAREN IDENT RPAREN   
;

STATS
:   'STATS'
;   

COUNT
:   'count'
;   

IDENT
:   (LETTER | '_') (LETTER | DIGIT | '_')*
;   

ASSIGN_SYM
: ':='
;

COMMA_SYM
: ','
;

SEMI_SYM
: ';'
;

LPAREN 
: '(' ;

RPAREN 
: ')' ;

fragment 
LETTER : ('a'..'z' | 'A'..'Z') ;

fragment 
DIGIT : '0'..'9';

これには、組み込み関数「count」が 1 つあります。しかし、次のテスト文字列を使用すると:

STATS count:=count(col1)

パーサーは次のようなエラーを返します。

mismatched input 'count' expecting IDENT

この問題を解決する方法についての手がかりやヒントはありますか?

ありがとうチャールズ

4

2 に答える 2

1

との両方にident一致するルールを作成し、そのルールをパーサールールで使用します(を使用する代わりに)。IDENTCOUNTIDENT

stats_statement
 : STATS ident ASSIGN_SYM functions_stats
 ;

functions_stats 
 :   COUNT LPAREN ident RPAREN   
 ;

ident
 : COUNT
 | IDENT
 ;
于 2013-02-14T20:52:49.770 に答える
0

lexerで認識されるためにCOUNTが本当に必要ですか? 関数を一致させるためのより一般的な方法を定義することを検討してください。

function 
  :   fn=IDENT LPAREN IDENT (',' IDENT)* RPAREN   
  ;

次に、テーブルで関数名を検索し、適切な数のパラメーターがあることを確認するなど、セマンティクスを処理するアクションを追加できます。

それが必要なことに合わない場合は、代わりにルールを削除してCOUNTルールを書き直すことができますfunctions_stats

functions_stats 
  :   {input.LT(1).getText().equals("count")}? IDENT LPAREN IDENT RPAREN   
  ;

the {...}?definitive ANTLR Reference by Terence Parr の 295 ページを参照)。true と評価された場合にのみ、これが一致します。ANTLR 3 には「巻き上げられたセマンティック述語」と呼ばれる機能があります。これは基本的に、セマンティック述語が適切な呼び出し元に配置され、functions_stats解析対象の決定に情報が使用されることを意味します。

本の 296 ページには「変数としてのキーワード」というセクションがあります。その章のサンプル コードを次に示します 。あなたはより良い理解。

この本自体は、高度な ANTLR 作業を行う場合に非常に役立ちます。オンライン ドキュメントでは、このようなことは十分に説明されていません。

于 2013-02-22T19:28:48.873 に答える