생각보다 쉽습니다. 당신은 술어조차 필요하지 않습니다.
<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'
고마워요! 그것은 정말로 내가하려고했던 것보다 훨씬 쉽습니다 ... ^^ – Korchkidu