用于自定义要求的Antlr解析器

时间:2013-04-03 04:33:44

标签: java antlr antlr3

我有一个非常特殊的要求,使用ANTLR解析输入。我希望能够解析像;

这样的表达式

更正输入

  • 用户名
  • user_name用户名
  • | EATALL任何东西都可以来这里/ ok | EATALL ......

输入无效

  • 用户/名称
  • 用户安培;名称^面

嗯,| EATALL&之后的任何表达。在| EATALL之前(如果有的话)必须作为单个标记获得。如果其他简单输入未显示| EATALL,则只有_-[a-zA-Z0-9]的有效组合会被标记为一个标记。在伪代码中,

  • 用户名 - > [用户] [姓名]
  • user_name - > [USER_NAME]
  • | EATALL用户/姓名我的用户 - > [user / name my user]

对我来说,这似乎是一种模糊的标记化案例。我正在寻找你在antlr处理这些问题的建议。高级感谢你。

1 个答案:

答案 0 :(得分:0)

那么,你有什么尝试?您是否对Antlr 3有疑问,或者您可以使用Antlr 4吗?

对于Antlr 3,您可以使用语义谓词来调整令牌规则选择。由于Antlr 4没有符号语义谓词,因此您可以使用本机代码操作来实现基本相同的结果。例如(未经测试):

lexer grammar eatall ;

ValidSimple : { isCurrenLineJustTEXTandWS() }? TEXT ;
-- or --
ValidSimple : TEXT ( WS TEXT)* EOL?  { emitEachTEXTasNewValidSimpleToken(); } ;

ValidEatAll : IgnoreL .*? IgnoreR    { trimIgnoreLRTextfromTokenText(); } ;
Invalid     : WS+ | .*? EOL?         -> channel(HIDDEN) ;

IgnoreL : .*? MARK ;
IgnoreR : MARK .*? EOL? ;

fragment MARK : '| EATALL' ;
fragment TEXT : [a-zA-Z0-9_-] ;
fragment EOL  : '\r'? '\n' ;
fragment WS   : [ \t] ;