antlr - 忽略 ANTLRworks 中的空格

标签 antlr antlrworks

我有以下 ANTLR 语法:

grammar mygrammar;

ASSIGNMENT 
    :   ID '=' INT
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

实际上只有ASSIGNMENT规则是我的,其余的都是ANTLRWorks 1.4.3添加的默认值。

当我在解释器中尝试语法时,诸如“a=5”的字符串成功,但诸如“b[space]=[space]6”的字符串失败:由于空格,我得到一个 MismatchedTokenException:

Picture of the interface with a MismatchedTokenException

来自阅读 ANTLR 网站和

Ignore rules: WS
{$channel=HIDDEN}
文本/语法规则,似乎应该忽略空格,但事实并非如此。

我做错了什么?

最佳答案

我知道您已经找到了答案,但让我解释一下为什么ASSIGNMENT 更改为 assignment 解决了这个问题。

因为以大写字母开头的规则是词法分析器规则(即标记)。并且 {skip();}{$channel=HIDDEN;} 导致词法分析器规则从解析器规则中跳过(或隐藏),而不是从词法分析器规则中。

这就是为什么 ASSIGNMENT(词法分析器规则)不接受任何空格,而 assignment(解析器规则)忽略它们的原因。

关于antlr - 忽略 ANTLRworks 中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897494/

相关文章:

Antlr 词法分析器对出现范围的支持?

c# - 如何为单独的 ANTLR 词法分析器和解析器添加虚构标记?

java - ANTLR 检查 commontree 是否正确或如何检查给定输入是否与 ANTLR 语法匹配?

string - 解释/测试 ANTLRWorks 2 中的字符串

java - 变量的 ANTLR 语法

parsing - 是否有可能有一个语法,其中 "keyword"也可以被视为 "non-keyword"?

intellij-idea - 如何知道 IntelliJ 中的 gradle 任务错误消息?

compiler-construction - 如何使用 ANTLR 修改 CommonTokenStream 中的 token 文本?

java - Java 正则表达式语法的 ANTLR 语法

java - 永远无法达到以下替代方案 : 2