java - ANTLR4:忽略输入中的空格但不忽略字符串文字中的空格

标签 java antlr4

我有一个简单的语法如下:

grammar SampleConfig;

line: ID (WS)* '=' (WS)* string;

ID: [a-zA-Z]+;
string: '"' (ESC|.)*? '"' ;
ESC : '\\"' | '\\\\' ; // 2-char sequences \" and \\
WS: [ \t]+ -> skip;

输入中的空格被完全忽略,包括字符串文字中的空格。

final String input = "key = \"value with spaces in between\"";
final SampleConfigLexer l = new SampleConfigLexer(new ANTLRInputStream(input));
final SampleConfigParser p = new SampleConfigParser(new CommonTokenStream(l));
final LineContext context = p.line();
System.out.println(context.getChildCount() + ": " + context.getText());

这将打印以下输出:

3: key="valuewithspacesinbetween"

但是,我希望保留字符串文字中的空格,即

3: key="value with spaces in between"

是否可以通过更正语法来实现此行为,或者我应该只覆盖 CommonTokenStream 以在解析过程中忽略空格?

最佳答案

你不应该期望解析器规则中有任何空格,因为你在你的词法分析器中跳过了它们。

要么删除跳过命令,要么使 string 成为词法分析器规则:

STRING : '"' ( '\\' [\\"] | ~[\\"\r\n] )* '"';

关于java - ANTLR4:忽略输入中的空格但不忽略字符串文字中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27915012/

相关文章:

java - 在 spring bean 中访问 Db 时的线程安全

Java newColor 构造函数随机化

java - Maven -DskipTests 被忽略

java - 从 Java 源代码生成 AST 报告而不实际运行它

ANTLR4:树结构

java - Spring Data - MongoDb 聚合 $ifNull

java - Google editboix 给出 InvalidElementStateException :Element is disabled and so may not be used for actions Command duration

c++ - ANTLR4 Lexing C++11 原始字符串

java - 使用ANTLR4获取方法的注释

c# - AnTLR4 C# 中的解析树