ANTLR:解析一个简单的语法并忽略非令牌

时间:2015-03-06 11:42:41

标签: antlr token antlr4 ignore

我想用ANTLR4解析一个简单的文件:

2011-02-23 20:21:22 STRONG bla bla bla bla
2012-04-21 19:23:11 WEAK blablablalba
...

My GrammarFile看起来像这样:

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 )*;

现在我只对每个条目的TIMESTAMP和STRENGTH的位置感兴趣。我不想只遍历令牌,因为我的文件看起来像:

2011-02-11 STRONG WEAK STRONG 2011-03-11 2011-03-11 2011-03-11 WEAK

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

我如何获得尽可能干净的位置?我如何忽略除了有效令牌之外的所有内容?我试着将它添加到我的mainRule:

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

但它没有按预期工作。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:0)

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

相关问题