Java 我可以指定一个特定的解析器规则来跳过空格吗?
g4: 这意味着跳过所有的空格。但是在某些特定的情况下,我只需要一些规则在分析时跳过空格 我如何指定一个特定的解析器规则来跳过空格?谢谢你的评论 我更新了问题: g4: 我的文本:Java 我可以指定一个特定的解析器规则来跳过空格吗?,java,antlr,antlr4,dsl,Java,Antlr,Antlr4,Dsl,g4: 这意味着跳过所有的空格。但是在某些特定的情况下,我只需要一些规则在分析时跳过空格 我如何指定一个特定的解析器规则来跳过空格?谢谢你的评论 我更新了问题: g4: 我的文本: WS: [\r\n \t] -> skip; String:[a-zA-Z]+; stringline:'"' String '"'; 如您所见,我需要在跳过空格的情况下将“aaaa-bbb”重新命名为“stringline”,我怎么能这样呢?解析器和lexer是独立的。您不能从解析器引导lexer。因此,
WS: [\r\n \t] -> skip;
String:[a-zA-Z]+;
stringline:'"' String '"';
如您所见,我需要在跳过空格的情况下将“aaaa-bbb”重新命名为“stringline”,我怎么能这样呢?解析器和lexer是独立的。您不能从解析器引导lexer。因此,要么跳过所有空格,要么不跳过,并且必须在每个规则中显式地处理它们(lexer+解析器) 如果你的解决方案真的需要特殊的空间处理等,比如重新定义你想要解析的语言(如果你有能力的话),那么最好考虑一下你的解决方案 更新:
从你在问题中的改变来看,似乎你在问如何在字符串中保留空格,这就是为什么Bart建议创建一个特定的lexer规则,其中包括外部引号和可能的空格。但是,您应该将WS-rule移动到远离语法的位置,以便它不会从其他规则中“窃取”空白。WS-rule通常是lexer语法中最后的规则之一(因为语法文件中的顺序很重要)。一般来说,Mike是对的。然而,词汇模式可能有一些可能。但是您需要给出一个实际的问题示例。为什么不创建一个带引号的lexer规则:“
String:”“~[\r\n”]*'”;
?String:““~[\r\n”]*'”;WS:[\r\n\t]->跳过;看起来好像是冲突。哦…我明白了。我对这个理论有一个错误的认识。谢谢你的评论,BartOh…我明白了…谢谢你的建议,MikeEm……你有C++规则文件吗?你能给我一份拷贝吗?什么是C++规则文件?如果您想查看ANTLR lexer语法的示例,请查看语法库:。对于答案本身:你必须勾选答案左边的复选标记才能接受它。我勾选了你评论左边的向上箭头。包括之前的答案(我答应过)。不是箭头,我是指投票显示下方的复选标记。
WS: [\r\n \t] -> skip;
String:[a-zA-Z]+;
stringline:'"' String '"';
"aaaa bbbb"