2009-07-18 16 views
2

私は、次のANTLR文法持っている:予想通り、ANTLRWorks 1.2.3通訳、入力hi worldhi/**/worldhi /*A*/ world仕事でANTLR隠しチャネルの空白の問題

grammar MyGrammar; 

doc : intro planet; 
intro : 'hi'; 
planet : 'world'; 
MLCOMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' { $channel = HIDDEN; }; 
WHITESPACE : ( 
    (' ' | '\t' | '\f')+ 
    | 
    // handle newlines 
    ('\r\n' // DOS/Windows 
     | '\r' // Macintosh 
     | '\n' // Unix 
    ) 
    ) 
{ $channel = HIDDEN; }; 

を。

ただし、入力hiworld,でないはずです。 hiworldを失敗させるにはどうすればよいですか? "hi"と "world"の間に少なくとも1つの空白(またはコメント)を強制するにはどうすればよいですか?

この例ではMLCOMMENTとWHITESPACEのみを使用して簡略化していますが、他の種類のコメントもサポートされています。 hiworldが失敗した文字列を作るために

+0

まあ、私はAntlrを知らないのですが、 "doc:intro WHITESPACE planet"なんかこれが一番明白ではないでしょうか? – schnaader

+0

チャネルWHITESPACEは非表示であるため、MismatchedTokenExceptionが発生します。 – luiscubal

+0

隠されていない別の空白文法を作成して使用できませんか? – schnaader

答えて

6

あなたは一般的なIDトークンを作成する必要があります。レクサーは最長のトークンを構築することができるので、入力「hiworld」は単独で「hi」または「world」よりも長いため、単一の単語として表示されます。このようなルールは次のようになります。一例として

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

、それはプログラミング言語のためのパーサは(「ダブル」(キーワードタイプ、「を実行」で始まる)または「完了」から「ん」のキーワードを分離正確にどのようです変数名)。

+0

この回答はちょうど私の頭の中で非常に多くのものをクリックしました。ありがとう –

0

一つの方法は、以下のように、失敗することが保証されて、検証セマンティック述語を使用することです:

doc:  intro planet; 
failure : 'hiworld' { false }?; 
intro : 'hi'; 
planet : 'world'; 
// rest of grammar omitted 
+0

非常に興味深いですが、もっと複雑な文法に1つの可能な失敗事例を追加すると、失敗状況の数は指数関数的に増加します。 – luiscubal

関連する問題