2009-10-31 15 views
6

私はANTLRのデータファイルを解析しようとしています - それはANTLRのオプションの空白をどのように管理できますか?

3 6 
    97 12 
15 18 

ラインが開始と終了があり、次のショーで例示オプションの空白があります。最後に改行があり、タブがありません。

^ 3 6$ 
^ 97 12$ 
^ 15 18$ 
^ 

私の文法は次のとおりです。

line 1:0 mismatched input ' ' expecting WSOPT 
WSOPT :null: 
NUM1 3 
WS : : 
NUM2 6 
line 2:0 mismatched input ' ' expecting WSOPT 
WSOPT :null: 
NUM1 97 
WS : : 
NUM2 12 
BUILD SUCCESSFUL (total time: 1 second) 

を与える

lines : line+; 
line : ws1 {System.out.println("WSOPT :"+$ws1.text+":");} 
       num1 {System.out.println("NUM1 "+$num1.text);} 
       ws2 {System.out.println("WS :"+$ws2.text+":");} 
       num2 {System.out.println("NUM2 "+$num2.text);} 
       NEWLINE 
    ; 
num1 : INT ; 
num2 : INT ; 
ws1 : WSOPT; 
ws2 : WS; 

INT  : '0'..'9'+; 
NEWLINE : '\r'? '\n'; 
//WS : (' '|'\t')+ ; 
WS : (' ')+ ; 
WSOPT : (' ')* ; 

(すなわち、主要なWSが認識されていないと、最後の行が失われました)。

私は、次のような空白なしで始まる行、解析したい:私はWSを解析の一般的な説明をいただければと思います

line 1:0 required (...)+ loop did not match anything at input ' ' 

^12 34$ 
^ 23 97$ 

を私は、その後のようなエラーが出ANTLR。それは明らかにトリッキーな領域です{ignore=WS}私が働いているから「決定的ANTLRリファレンス」の本には表示されません -

EDIT @jitterは便利な答えを持っています。

lines : line line line; 
line 
options { ignore=WS; } 
     : 
       ws1 {System.out.println("WSOPT :"+$ws1.text+":");} 
       num1 {System.out.println("NUM1 "+$num1.text);} 
       ws2 {System.out.println("WS :"+$ws2.text+":");} 
       num2 {System.out.println("NUM2 "+$num2.text);} 
       NEWLINE 
    ; 

が、エラーを取得:

illegal option ignore 

EDITどうやらこれはV3から削除されました: http://www.antlr.org/pipermail/antlr-interest/2007-February/019423.html

私はこれを変更した、まだ を必要

HELP

+0

+1、私は同じ問題を抱え、レモンパーサーの大きなハックを使用してしまいました。これに続いて興味を持ってください。 –

+0

@tinkertimありがとう - それは完全なダミーではないことを知ることは常にいいです。 –

答えて

0

を使用する必要がレクサーで空白を無視して、この見出し

で始まるパーツを検索:

WS : (' ')+ {skip();}; 

WSOPT :  (' ')* {skip();}; 

ただし、NEWLINEには含まれません。その後のようなパーサ構築物において:

num1 num2 NEWLINE; 

キーは改行以外のレクサーのすべてのWSを取り除くことでした。

2

チェックLexical Analysis with ANTLRその後、あなたは私がレクサーのような構築この作業を使用して取得するために管理している{ ignore=WS; }ルール

+0

ありがとうございます - 私はこれを試して報告します。 FWIWでは、正確な書式設定も重要な場合があるので、私は切り替えることができます。 –

+0

**編集**これはV3 –

8
WS : (' ' | '\t')+ 
    {$channel = HIDDEN;} 
    ; 
+1

Antlr4バージョンでは利用できないようです:WS:( '' | '\ t')+ - > channel(HIDDEN); –

関連する問題