ANTLR 模式 "line 1:9 extraneous input ' ' expecting WORD"
ANTLR Pattern "line 1:9 extraneous input ' ' expecting WORD"
我刚刚开始使用 ANTLR。我正在尝试为看起来像这样的字段定义编写 parser:
field_name = value
示例:
is_true_true = yes;
我的语法是这样的:
grammar Hello;
//Lexer Rules
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT: '0'..'9';
fragment TRUE: 'TRUE'|'true';
fragment FALSE: 'FALSE'|'false';
INTEGER : DIGIT+ ;
STRING : ('\''.*?'\'') ;
BOOLEAN : (TRUE|FALSE);
WORD : (LOWERCASE | UPPERCASE | '_')+ ;
WHITESPACE : (' ' | '\t')+ ;
NEWLINE : ('\r'? '\n' | '\r')+ ;
field_def : WORD '=' WORD ';' ;
但是当我 运行 在 'working = yes;' 上生成的解析器时,我收到错误消息:
line 1:7 extraneous input ' ' expecting '='
line 1:9 extraneous input ' ' expecting WORD
我不太明白,匹配 WORD
模式是否有错误,或者完全是其他原因?
你的例子有空格,但你的 field_def
没有考虑到它。
由于通常空格对您的语法来说并不重要(即它没有语义意义,除了分隔单词),ANTLR 可以跳过它:
在 ANTLR 4 中,这是由
完成的
WHITESPACE : (' ' | '\t')+ -> skip;
NEWLINE : ('\r'? '\n' | '\r')+ -> skip;
在 ANTLR 3 中语法是
WHITESPACE : (' ' | '\t')+ { $channel = HIDDEN; };
NEWLINE : ('\r'? '\n' | '\r')+ { $channel = HIDDEN; };
词法分析器像往常一样对输入进行分词,但解析器知道这些分词对它来说并不重要,并且表现得好像它们不存在一样,从而使您的规则保持简单,而无需添加可选的到处都是空白。
我刚刚开始使用 ANTLR。我正在尝试为看起来像这样的字段定义编写 parser:
field_name = value
示例:
is_true_true = yes;
我的语法是这样的:
grammar Hello;
//Lexer Rules
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT: '0'..'9';
fragment TRUE: 'TRUE'|'true';
fragment FALSE: 'FALSE'|'false';
INTEGER : DIGIT+ ;
STRING : ('\''.*?'\'') ;
BOOLEAN : (TRUE|FALSE);
WORD : (LOWERCASE | UPPERCASE | '_')+ ;
WHITESPACE : (' ' | '\t')+ ;
NEWLINE : ('\r'? '\n' | '\r')+ ;
field_def : WORD '=' WORD ';' ;
但是当我 运行 在 'working = yes;' 上生成的解析器时,我收到错误消息:
line 1:7 extraneous input ' ' expecting '='
line 1:9 extraneous input ' ' expecting WORD
我不太明白,匹配 WORD
模式是否有错误,或者完全是其他原因?
你的例子有空格,但你的 field_def
没有考虑到它。
由于通常空格对您的语法来说并不重要(即它没有语义意义,除了分隔单词),ANTLR 可以跳过它:
在 ANTLR 4 中,这是由
完成的WHITESPACE : (' ' | '\t')+ -> skip;
NEWLINE : ('\r'? '\n' | '\r')+ -> skip;
在 ANTLR 3 中语法是
WHITESPACE : (' ' | '\t')+ { $channel = HIDDEN; };
NEWLINE : ('\r'? '\n' | '\r')+ { $channel = HIDDEN; };
词法分析器像往常一样对输入进行分词,但解析器知道这些分词对它来说并不重要,并且表现得好像它们不存在一样,从而使您的规则保持简单,而无需添加可选的到处都是空白。