“ANTLR模式”;第1行:9无关输入'';期望词;

“ANTLR模式”;第1行:9无关输入'';期望词;,antlr,Antlr,我刚刚开始使用ANTLR。我正在尝试为如下字段定义编写一个解析器: field_name = value 例如: is_true_true = yes; 我的语法是这样的: 但是当我在'working=yes;'上运行生成的解析器时我收到错误消息: 第1行:7外部输入“”应为'=' 第1行:9外部输入“”应为单词 我不完全理解这一点,匹配单词-模式时是否有错误,或者完全是其他原因吗?您的示例中有空格,但您的字段定义没有说明原因。您的示例中有空格,但您的字段定义没有说明原因。因为通常情况下

我刚刚开始使用ANTLR。我正在尝试为如下字段定义编写一个解析器:

field_name = value
例如:

is_true_true = yes;
我的语法是这样的:


但是当我在'working=yes;'上运行生成的解析器时我收到错误消息:

第1行:7外部输入“”应为'='

第1行:9外部输入“”应为单词



我不完全理解这一点,匹配
单词
-模式时是否有错误,或者完全是其他原因吗?

您的示例中有空格,但您的
字段定义
没有说明原因。

您的示例中有空格,但您的
字段定义
没有说明原因。

因为通常情况下,空格对您来说并不重要您的语法(即,除了分隔单词之外,它没有语义意义),ANTLR可以跳过它:

在ANTLR 4中,这是由

WHITESPACE          : (' ' | '\t')+  -> skip;
NEWLINE             : ('\r'? '\n' | '\r')+ -> skip;
在ANTLR 3中,语法是

WHITESPACE          : (' ' | '\t')+ { $channel = HIDDEN; };
NEWLINE             : ('\r'? '\n' | '\r')+ { $channel = HIDDEN; };

这样做的目的是lexer像往常一样标记输入,但是解析器知道这些标记对它来说并不重要,并且表现得好像它们不在那里一样,从而允许您保持规则的简单性,而无需在任何地方添加可选的空白。

因为空白对语法来说都不重要(也就是说,除了分隔单词之外,它没有语义意义),ANTLR可以跳过它:

在ANTLR 4中,这是由

WHITESPACE          : (' ' | '\t')+  -> skip;
NEWLINE             : ('\r'? '\n' | '\r')+ -> skip;
在ANTLR 3中,语法是

WHITESPACE          : (' ' | '\t')+ { $channel = HIDDEN; };
NEWLINE             : ('\r'? '\n' | '\r')+ { $channel = HIDDEN; };

它的作用是lexer像往常一样标记输入,但是解析器知道这些标记对它来说并不重要,并且表现得好像它们不在那里一样,允许您保持规则的简单性,而无需在任何地方添加可选的空格。

这看起来绝对像是一个更高级别的API,而不仅仅是正则表达式,所以我很抱歉删除标记。看起来您没有考虑字段def中的空格。@DanielA.White谢谢!这就是错误所在。这看起来肯定是一个比正则表达式更高级的API,所以我正在删除标记。看起来您没有考虑字段def中的空格。@DanielA.White谢谢!这就是错误所在。