我使用的是ANTLR 4.7。
输入如下:
foreach
如何在$archive
?
目前,我正在使用如下的词法分析器规则:
[section a]
bla bla bla
[section b] <<<<<<< to ignore
bla bla bla <<<<<<< to ignore
[section c]
bla bla bla
我使用[section b]
作为下一部分开头的指标。所以忽视那里就停止了。
但如果b部分内容包含Section_Igonre : '[section b]' (~'[')* ->skip;
,我担心这不太可靠。所以我想首先使用一个令牌来匹配section标签。然后使用令牌作为指示符来停止忽略。
[
这可能吗?我在下面试过,但ANTLR拒绝了它:
[
错误说:
严重性:'错误'消息:'规则参考SectionTag当前不是 支持在一个'
中
答案 0 :(得分:0)
在成功解析后,最方便地在您的Visitor或Listener类中完成。这很像问题answered here by another high-reputation ANTLR expert。
我只是让它解析,并创建一个空的Listener或Visitor覆盖,它与你提及的部分完全无关。
答案 1 :(得分:0)
首先,在Section_ Igonre 中似乎存在拼写错误,这可能是您的整个问题!
无论如何,试试这个,HTH。
grammar ini;
prog : section+ EOF ;
section : ( SectionIgnore | SectionTag ) BODYTEXT
;
SectionIgnore : '[section b]' (~'[')*
{ System.out.println("got an ignored sectiontag !");}
-> skip
;
SectionTag : '[' [a-zA-Z ]+? ']' NEWLINE
{ System.out.println("got a sectiontag !");}
;
BODYTEXT : (~'[')* NEWLINE
{ System.out.println("got BODYTEXT!");}
;
NEWLINE : '\r'? '\n' ;
我用以下数据测试了它
[section a]
first bla bla bla
two line section
[section b]
bla bla bla <<<<<<< to ignore this section
[section c]
second bla bla bla
[section b]
repeated bla bla bla <<<<<<< to ignore this section
grun
的输出是
$ grun ini prog -tree -tokens data
got a sectiontag !
got BODYTEXT!
got an ignored sectiontag !
got a sectiontag !
got BODYTEXT!
got an ignored sectiontag !
[@0,0:11='[section a]\n',<SectionTag>,1:0]
[@1,12:47='first bla bla bla\ntwo line section\n\n',<BODYTEXT>,2:0]
[@2,104:115='[section c]\n',<SectionTag>,8:0]
[@3,116:135='second bla bla bla\n\n',<BODYTEXT>,9:0]
[@4,201:200='<EOF>',<EOF>,14:0]
(prog
(section [section a]\n first bla bla bla\ntwo line section\n\n)
(section [section c]\n second bla bla bla\n\n)
<EOF>)
$