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