【问题标题】:Process whitespace in specific ANTLR parser rule but skip it in all other cases在特定的 ANTLR 解析器规则中处理空格,但在所有其他情况下跳过它
【发布时间】:2015-07-01 10:13:58
【问题描述】:

也许有人可以帮助我。我写了一个 ANTLR 语法,简而言之是这样的:

grammar myGrammar;
file: mystring+;
mystring: name EQUALITYSIGN DOUBLEQUOTE stringVal DOUBLEQUOTE SEMICOLON;
stringVal: (CHAR | INT)*;
name: CHAR | INT;
EQUALITYSIGN : '=';
DOUBLEQUOTE: '"';
SEMICOLON: ';';
WHITESPACE : ' ' -> skip;
NEWLINE : '\r'? '\n' -> skip;
CHAR : ~[ \t\r\n\\\[\]";=]+;

我对其他数据类型有不同的解析器规则,但考虑到字符串类型,我不想跳过空格。

例如,输入可能如下所示:

string1 = " a ";

在这种情况下,我希望保留“a”前后的空格。因此,双引号内的任何内容都应按原样保留。

我曾尝试使用已定义的渠道来执行此操作,但显然我做错了什么。

有什么想法吗?

提前谢谢!

【问题讨论】:

  • 我不使用ANTLR,所以这只是一个猜测:你试过stringVal: DOUBLEQUOTE (CHAR | INT)* DOUBLEQUOTE ;吗? (当然,然后从mystring 中取出双引号)。
  • Thanx 但这没有任何区别。问题是我定义了一般要跳过的空格,但想为 myString 规则设置一个例外。而且我还没有完全成功地做到这一点。
  • 我相信 Bart 有它——我的想法和他一样,我只是不确定 ANTLR 如何区分词法分析器和解析器规则。

标签: antlr whitespace


【解决方案1】:

您需要将stringVal 设为词法分析器规则:

STRING: '"' ~'"'* '"';

并删除DOUBLEQUOTE

【讨论】:

  • 嗨,巴特,谢谢你 - 成功了。但是,我在相同的语法中有另一种数据类型,它几乎与字符串完全一样,但没有用双引号括起来:anotherType : key EQUALITYSIGN value SEMICOLON; value: (CHAR | EQUALITYSIGN)*; 。词法分析器规则的技巧不适用于这个。输入示例为:anotherValue = value(1) + value(2);
  • 还有可能保留字符串的解析器规则并使用隐藏通道吗?我的设计需要单独解析值:public void exitStringVal(MyParser.StringValContext ctx) { value = getValue(ctx);}
  • 嗨,我现在也让它适用于其他类型。我在扩展 BaseListener 类的 Loader 类中添加了以下内容:value = ctx.start.getInputStream().getText(Interval.of(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多