ANTLR4:是否可以匹配一个未跟随令牌的内容?

时间:2017-08-02 07:55:14

标签: compiler-construction antlr antlr4 lexer

我使用的是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当前不是   支持在一个'

2 个答案:

答案 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>)
$