2016-05-12 7 views
3

私はantlr4で文法を書こうとしています。しかし、私はルール内の空白を選択的に無視することはできません。私の文法をつける。ここでは、トークンがalphaNumericWSCと一致する場合はスペース(WHITESPACEのトークン)を許可しますが、他のすべての場所ではWHITESPACEをスキップします。antlr文法に空白文字列を認識させるには?

WHITESPACE : [ \t\n\r]+ -> skip 
alphaNumericWSC : AlphaNumeric (',' AlphaNumeric)* 
       | AlphaNumeric (' ' AlphaNumeric)* 
       ; 

つまり、このルールでは、このルールalphaNumericWSCだけを無視しません。

ご協力いただきありがとうございます。

+2

あなたは、文字列の '文字列字句規則を使用する必要があります。「「」〜「」」を「"」 '(注釈 '' 'はスペースなしで' '' 'です。ANTLRのレクサーの貪欲さは仕事をします。 – Mephy

+0

空白はパーサーではなくレクサーのためのものです。 – EJP

答えて

2

与えられたレクサーの空白ルールは、すべての空白をパーサに到達する前に消費します。したがって、空白がパーザにとって重要な場合は、消費しないでください。

ANTLRは、空白に敏感なソース領域と鈍感なソース領域を切り替えるために使用できるレクサーモードを提供します。モードでは、モードを切り替えるために使用できる明確なソース機能を特定する必要があります。

質問は正確にAlphaNumeric (' ' AlphaNumeric)*が有効な場合です。具体的に適用可能なマーカーがある場合は、:=が有力と;は、例えば末尾の言う、モードを定義します。

alphaNumericWSC : AlphaNumeric (Comma AlphaNumeric)* 
       | AlphaNumeric (WS AlphaNumeric)* 
       ; 


AlphaNumeric : AlphaNum ; 
Mark   : ':=' -> pushMode(WSS); 
Semi   : ';' ; 
Comma   : ',' ; 
WHITESPACE : [ \t\n\r]+ -> skip; 

mode WSS; 
WS   : ' '+ ; 
AlphaNumeric2 : AlphaNum -> type(AlphaNumeric); 
Semi2   : ';'  -> type(Semi), popMode(); 
WHITESPACE2 : [\t\n\r]+ -> skip; 

fragment AlphaNum : .... ; 
関連する問題