Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于定制需求的Antlr解析器_Java_Antlr_Antlr3 - Fatal编程技术网

Java 用于定制需求的Antlr解析器

Java 用于定制需求的Antlr解析器,java,antlr,antlr3,Java,Antlr,Antlr3,我有一个非常特殊的需求,需要使用ANTLR解析输入。我希望能够像解析表达式 正确输入 用户名 用户名 |吃任何东西都可以来这里/好的|吃 无效输入 用户/名称 用户名^face(&N) 那么,在|EATALL之后和|EATALL之前出现的任何表达式(如果有)都必须作为单个标记获取。如果其他简单输入没有出现|EATALL,则只有、-、[a-zA-Z0-9]的有效组合被标记为一个标记。在伪代码中 用户名->[用户名][名称] 用户名->[用户名] |EATALL user/name my

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

正确输入

  • 用户名
  • 用户名
  • |吃任何东西都可以来这里/好的|吃
无效输入

  • 用户/名称
  • 用户名^face(&N)
那么,在
|EATALL
之后和
|EATALL
之前出现的任何表达式(如果有)都必须作为单个标记获取。如果其他简单输入没有出现
|EATALL
,则只有
-
[a-zA-Z0-9]
的有效组合被标记为一个标记。在伪代码中

  • 用户名->[用户名][名称]
  • 用户名->[用户名]
  • |EATALL user/name my user->[user/name my user]

对我来说,这似乎已经是一个模棱两可的标记化案例。我正在寻求您对antlr处理此类问题的建议。提前感谢你。

那么,你试过什么了?您的问题是针对Antlr 3的,还是可以使用Antlr 4

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


乍一看,您的问题似乎可以由正则表达式处理,而不需要上下文无关的语法。所以我认为没有必要使用Antlr,这只是输入解析问题的一小部分。我特别请求有关antlr的帮助。我特别是在Antlrv3的上下文中进行讨论。我真的被卡住了。我不知道如何强制lexer在EATALL出现时创建一个大标记,在简单输入时创建不同的标记。正如我所说,使用语义谓词启用“EATALL”规则。将该规则置于简单输入规则之上。在EadAll规则上使用本机代码操作,从标记文本中修剪不需要的文本。在EatAll规则中使用a,使用标记之间的文本。该链接返回到Antlr4文档。对于Antlr4,*?这是一个没有芦苇的地方。对于Antlr3.5语法,.*构造默认为nongreedy.ok。。。我现在检查你的建议。谢谢您的时间。:)
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] ;