2011-12-23 11 views
3

私は2つの部分で作られたファイルを解析する必要があります。最初の行では、新しい行をスキップする必要があります。第2のものでは、それらは重要であり、デリミタとして使用されます。選択的に文脈に応じて改行をスキップ

http://www.antlr.org/wiki/pages/viewpage.action?pageId=1734のような解決策を避け、代わりに述語を使用したいと考えています。私は、ファイルの第二部「を入力する」ときにtrueに設定されている動的スコープ変数keepNewlineを追加しようとしました

WS:  (' ' | '\t' | NEWLINE) {SKIP();}; 
fragment NEWLINE : '\r'|'\n'|'\r\n'; 

:瞬間のために

は、私のようなものを持っています。

ただし、改行の「スキップ」をオフにする正しい述語を作成できません。

ご協力いただければ幸いです。

よろしくお願いいたします。

答えて

4

あなたが考えるよりも簡単です:あなたは述語が必要でもありません。

改行は、<pre> ... </pre>タグ内でのみ保存した​​いとします。以下のダミー文法は、まさにそれを行います。

あなたはクラスでテストすることができます
grammar Pre; 

@lexer::members { 
    private boolean keepNewLine = false; 
} 

parse 
: (t=. 
    { 
    System.out.printf("\%-10s '\%s'\n", tokenNames[$t.type], $t.text.replace("\n", "\\n")); 
    } 
    )* 
    EOF 
; 

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

OPr 
: '<pre>' {keepNewLine = true;} 
; 

CPr 
: '</pre>' {keepNewLine = false;} 
; 

NewLine 
: ('\r'? '\n' | '\r') {if(!keepNewLine) skip();} 
; 

Space 
: (' ' | '\t') {skip();} 
; 

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    PreLexer lexer = new PreLexer(new ANTLRFileStream("in.txt")); 
    PreParser parser = new PreParser(new CommonTokenStream(lexer)); 
    parser.parse(); 
    } 
} 

そしてin.txtが含まれているかの:

foo bar 
<pre> 
a 

b 
</pre> 


baz 

Mainクラスを実行しているの出力を

Word  'foo' 
Word  'bar' 
OPr  '<pre>' 
NewLine '\n' 
Word  'a' 
NewLine '\n' 
NewLine '\n' 
Word  'b' 
NewLine '\n' 
CPr  '</pre>' 
Word  'baz' 
+0

ありがとう!それは本当に私がやろうとしているものよりずっと簡単です... ^^ – Korchkidu

関連する問題