2016-01-05 5 views
7

/のレクサー/パーサーの.g4文法があります。レクサーが行継続トークンをスキップしているため、パーサーをスキップすることはできません。これが原因となっているインデントされていないコードで自分の文法が壊れる

LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 

問題は、継続行は、カラム1で起動するたびに、パーサが吹くということである:ここで問題になっているレクサールールです

Sub Test() 
Debug.Print "Some text " & _ 
vbNewLine & "Some more text"  
End Sub 

は、私はちょっと私が知っている」と思いました!アンダースコアの前に余分な空白を挿入し、それを受け入れるように文法を変更するためにANTLRに与えている文字列をプリプロセスします。

だから私はこのようなルールの変更:

LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : [ \t]+; 

を...そして上記のテストのコードは、私にこのパーサエラーました:今、私の唯一の解決策は、私を伝えることであるために

extraneous input 'vbNewLine' expecting WS

をユーザーがコードを適切にインデントするその文法規則を修正する方法はありますか?

(Full VBA.g4 grammar file on GitHub)

+0

なぜLINE_CONTINUATIONをWSにマージしないのですか? –

+0

@IraBaxter「WS」は、他の多くの場所で使用されています。どういう意味ですか? –

+1

基本的には、行の継続を空白のように扱いたいと思っています。 [OK]をクリックして、WSトークンに語継続の行継続を追加します。 –

答えて

4

あなたは基本的に行継続が空白のように扱われたいです。

OKをクリックし、WSトークンに行継続の字句定義を追加します。その後、WSは行の継続を取得し、どこにでもLINECONTINUATIONは必要ありません。

//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : ([ \t]+)|(' ' '_' '\r'? '\n'); 
+0

私は気になるよ。出来た! –

+0

話が早すぎます。 OP *の特定のケースのために*働いていたので、WSルールをWS:[\ t] +( '_' '\ r'? '\ n')に変更しようとしました。 'オプションのベース1が' Option _ \ r \ nBase _ \ r \ n1'に分割されているような奇妙なものをサポートしています。これは素晴らしいですが、継続する行にインデントがあり、私は理解している定義が* 1つ以上のスペース/タブに一致する必要があるので、理由を理解できません...手がかりを得ましたか? –

+1

私は物事を別々に定義したと思います。HWS = [\ t \] +; ENDLINE = \ r? \ n; NEWLINE = HWS? ENDLINE; WS = HWS(ENDLINE HWS?)? ;この最後のビットは、あなたの "継続された行にインデントがあります"。残りの部分は、理解しやすくするためのものです。 (HWS == "水平空白")。 –

関連する問題