grammar NameValue;
nameValue: (name=ID ':' value=ID)+ EOF;
//idWithSpace : ID (' ' ID)*;
ID : [a-zA-Z]+ ;
WS : [ \t\r\n]+ -> skip ; // Define whitespace rule, toss it out
a:b
a : b
A : B
(nameValue a : b a : b A : B <EOF>)
line 2:1 extraneous input ' ' expecting ':'
line 2:3 extraneous input ' ' expecting ID
(nameValue a : b a : b A : B <EOF>)
idWithSpace : ID (' ' ID)*;
如果没有引用,会导致解析发生更改吗?
这条规则:
idWithSpace : ID (' ' ID)*;
由于嵌入字符串'',隐式创建匹配单个空格字符的lexer规则,并将其放在所有其他lexer规则之前。因此,每当遇到单个空格字符时,它就有效地屏蔽了WS规则。因此,单个空间不能再被跳过,而是被标记并传递给解析器。但是没有解析器规则允许在:之前有一个空格,所以它抱怨额外的''输入:
line 2:1 extraneous input ' ' expecting ':'
当我第一次使用ANTLR时,我被这类虫子咬了很多。
我的语法在很大程度上必须忽略空格,除非在某些上下文中。这个问题的答案建议定义特定的lexer规则来处理我想要的异常。 问题是(我认为)我不能在lexer级别处理这种情况,因为它们似乎是在解析器级别被触发的。 更具体地说:我想认识一些东西,比如 记住我有一个WS- 在Xtext中,规则可以在规则范围的基础上指定在规则范围内应用哪些隐藏令牌: 但是我对antlr4一无所知。
可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?
我对是否允许以下情况感到困惑: UPDATE:我知道当我在for循环中提供正确的声明类型时,它就会工作。问题是如果我不这样做会发生什么?
谢谢回复! 皮特
需要注意的方法是和。实际上,我依赖于这样一个事实,即每个节点最终都分解为终端,因此如果一个节点没有被另一个重写处理(例如中的),那么它的每个终端都将位于中。对的每次调用都会添加到索引字段中,我假定该字段与AST和原始文本同步。也就是说,应该同时表示原始文本中的索引和当前标记的索引。 我最近遇到了一个空白问题。语法规则似乎悄无声息地吃掉了空白,而没有在任何解析器规则中提到它。这会导致空白标记无法通过
我正在为用ANTLR4编写的Decaf编程语言创建解析器和lexer规则。我试图解析一个测试文件,但不断地得到一个错误,一定是语法有问题,但我无法理解。 我的测试文件如下所示: 错误是:第2行:8不匹配的输入“10”应为INT_LITERAL 下面是完整的decaf.g4语法文件