ANTLR:解析简单语法并忽略非标记

ANTLR:解析简单语法并忽略非标记,antlr,token,antlr4,ignore,Antlr,Token,Antlr4,Ignore,我想用ANTLR4解析一个简单文件,如下所示: 2011-02-23 20:21:22 STRONG bla bla bla bla 2012-04-21 19:23:11 WEAK blablablalba ... 我的语法文件如下所示: grammar TestGrammar; // timestamp format: fragment YEAR: ('0'..'9')('0'..'9')('0'..'9')('0'..'9'); fragment MONTH: ('0'..'9')

我想用ANTLR4解析一个简单文件,如下所示:

2011-02-23 20:21:22 STRONG bla bla bla bla
2012-04-21 19:23:11 WEAK blablablalba
...
我的语法文件如下所示:

grammar TestGrammar;


// timestamp format:

fragment YEAR: ('0'..'9')('0'..'9')('0'..'9')('0'..'9');
fragment MONTH: ('0'..'9')('0'..'9');
fragment DAY: ('0'..'9')('0'..'9');

fragment HOURS: ('0'..'9')('0'..'9');
fragment MINUTES: ('0'..'9')('0'..'9');
fragment SECONDS: ('0'..'9')('0'..'9');

// Example for a valid timestamp: 2014-03-25 20:21:22
TIMESTAMP : (YEAR)('-')(MONTH)('-')(DAY)(' ')(HOURS)(':')(MINUTES)(':')(SECONDS);
STRENGTH : 'STRONG' | 'WEAK';


// Skip whitespace, tabs, etc..
WS : [ \r\t\u000C\n]+ -> skip ;


mainRule: (TIMESTAMP STRENGTH )*;
现在我只对每个条目的时间戳和强度的位置感兴趣。我不想只遍历令牌,因为我的文件可能看起来像:

2011-02-11 STRONG WEAK STRONG 2011-03-11 2011-03-11 2011-03-11 WEAK
所以我希望解析器只识别:2011-02-11强和2011-03-11弱

我如何才能获得尽可能干净的职位?除了我的有效代币,我怎么能忽略一切?我试图将此添加到我的主要规则中:

mainRule: (TIMESTAMP STRENGTH ~(TIMESTAMP | STRENGTH))*

但它并没有按预期的那样工作。有什么建议吗?谢谢

我的建议是:不要为此使用像ANTLR这样的解析器。在这种非常简单的情况下,只需逐行读取文件,并使用一些常用的字符串操作(substr()或类似操作)提取2个字段,就可以获得更好的效果。这使得整个任务简单得多。对作业始终使用正确的工具。

我所说的位置是指:文件中的字节位置(可通过token.startIndex()获得)