Antlr4 语法意外错误(C++ 目标)
Antlr4 grammar unexpected error (C++ target)
我正在使用 Antlr 4.7.1 的 C++ 目标,某些输入字符串触发了意外错误。
未按原样使用语法文件解析的字符串:
keys abc-def;
给出的错误:
Line(1:5) Error(mismatched input 'abc-def' expecting {KEY_NAME_PATTERN, STRING_LITERAL})
奇怪的是,如果我在语法文件中交换 KEY_NAME_IDENTIFIER 和 KEY_NAME_PATTERN 的规则位置,那么上面的字符串解析正常,但下面的字符串现在失败了(通过不交换规则位置):
get key abc-def;
所以我怀疑 Antlr 中存在错误,但不是 100% 确定。
语法文件:
grammar ModelKeyValue;
start : keyvalue_statements ;
keyvalue_statements: ( del_statement | get_statement | set_statement | keys_statement ) ';'
;
del_statement:
KEYWORD_DEL key_name
;
get_statement:
KEYWORD_GET key_name
;
set_statement:
KEYWORD_SET key_name literal_value
;
keys_statement:
KEYWORD_KEYS key_name_pattern
;
keyword:
KEYWORD_DEL
| KEYWORD_GET
| KEYWORD_SET
| KEYWORD_KEYS
;
key_name:
KEY_NAME_IDENTIFIER
| STRING_LITERAL
;
key_name_pattern:
KEY_NAME_PATTERN
| STRING_LITERAL
;
literal_value:
STRING_LITERAL
;
KEYWORD_DEL: D E L;
KEYWORD_GET: G E T;
KEYWORD_SET: S E T;
KEYWORD_KEYS: K E Y S;
KEY_NAME_IDENTIFIER: ([a-z]|[A-Z]|[0-9]|'!'|'@'|'#'|'$'|':'|'-')+;
KEY_NAME_PATTERN: ([a-z]|[A-Z]|[0-9]|'!'|'@'|'#'|'$'|':'|'-'|'_'|'%')+;
STRING_LITERAL:
'\'' ( ~'\'' | '\'\'' )* '\''
| '"' ('\' ~('\r' | '\n') | ~('\' | '"'| '\r' | '\n'))* '"'
;
fragment A: [aA];
fragment B: [bB];
fragment C: [cC];
fragment D: [dD];
fragment E: [eE];
fragment F: [fF];
fragment G: [gG];
fragment H: [hH];
fragment I: [iI];
fragment J: [jJ];
fragment K: [kK];
fragment L: [lL];
fragment M: [mM];
fragment N: [nN];
fragment O: [oO];
fragment P: [pP];
fragment Q: [qQ];
fragment R: [rR];
fragment S: [sS];
fragment T: [tT];
fragment U: [uU];
fragment V: [vV];
fragment W: [wW];
fragment X: [xX];
fragment Y: [yY];
fragment Z: [zZ];
WS: [ \t\r\n]+ -> skip ;
如果有人可以验证此问题或提出有很大帮助的修复方法,谢谢。
不,这不是错误。您误解了标记化的工作原理。就像这样:每当有 2 个(或更多)规则匹配相同数量的字符时,例如 KEY_NAME_IDENTIFIER
和 KEY_NAME_PATTERN
用于输入 keys abc-def;
,首先定义的规则 "wins".词法分析器不会 "listen" 到解析器(就像无扫描器解析器一样工作)。没有办法解决这个问题。
要修复它,只需在您的 key_name_pattern
作品中包含 KEY_NAME_IDENTIFIER
:
key_name_pattern
: KEY_NAME_IDENTIFIER
| KEY_NAME_PATTERN
| STRING_LITERAL
;
我正在使用 Antlr 4.7.1 的 C++ 目标,某些输入字符串触发了意外错误。
未按原样使用语法文件解析的字符串:
keys abc-def;
给出的错误:
Line(1:5) Error(mismatched input 'abc-def' expecting {KEY_NAME_PATTERN, STRING_LITERAL})
奇怪的是,如果我在语法文件中交换 KEY_NAME_IDENTIFIER 和 KEY_NAME_PATTERN 的规则位置,那么上面的字符串解析正常,但下面的字符串现在失败了(通过不交换规则位置):
get key abc-def;
所以我怀疑 Antlr 中存在错误,但不是 100% 确定。
语法文件:
grammar ModelKeyValue;
start : keyvalue_statements ;
keyvalue_statements: ( del_statement | get_statement | set_statement | keys_statement ) ';'
;
del_statement:
KEYWORD_DEL key_name
;
get_statement:
KEYWORD_GET key_name
;
set_statement:
KEYWORD_SET key_name literal_value
;
keys_statement:
KEYWORD_KEYS key_name_pattern
;
keyword:
KEYWORD_DEL
| KEYWORD_GET
| KEYWORD_SET
| KEYWORD_KEYS
;
key_name:
KEY_NAME_IDENTIFIER
| STRING_LITERAL
;
key_name_pattern:
KEY_NAME_PATTERN
| STRING_LITERAL
;
literal_value:
STRING_LITERAL
;
KEYWORD_DEL: D E L;
KEYWORD_GET: G E T;
KEYWORD_SET: S E T;
KEYWORD_KEYS: K E Y S;
KEY_NAME_IDENTIFIER: ([a-z]|[A-Z]|[0-9]|'!'|'@'|'#'|'$'|':'|'-')+;
KEY_NAME_PATTERN: ([a-z]|[A-Z]|[0-9]|'!'|'@'|'#'|'$'|':'|'-'|'_'|'%')+;
STRING_LITERAL:
'\'' ( ~'\'' | '\'\'' )* '\''
| '"' ('\' ~('\r' | '\n') | ~('\' | '"'| '\r' | '\n'))* '"'
;
fragment A: [aA];
fragment B: [bB];
fragment C: [cC];
fragment D: [dD];
fragment E: [eE];
fragment F: [fF];
fragment G: [gG];
fragment H: [hH];
fragment I: [iI];
fragment J: [jJ];
fragment K: [kK];
fragment L: [lL];
fragment M: [mM];
fragment N: [nN];
fragment O: [oO];
fragment P: [pP];
fragment Q: [qQ];
fragment R: [rR];
fragment S: [sS];
fragment T: [tT];
fragment U: [uU];
fragment V: [vV];
fragment W: [wW];
fragment X: [xX];
fragment Y: [yY];
fragment Z: [zZ];
WS: [ \t\r\n]+ -> skip ;
如果有人可以验证此问题或提出有很大帮助的修复方法,谢谢。
不,这不是错误。您误解了标记化的工作原理。就像这样:每当有 2 个(或更多)规则匹配相同数量的字符时,例如 KEY_NAME_IDENTIFIER
和 KEY_NAME_PATTERN
用于输入 keys abc-def;
,首先定义的规则 "wins".词法分析器不会 "listen" 到解析器(就像无扫描器解析器一样工作)。没有办法解决这个问题。
要修复它,只需在您的 key_name_pattern
作品中包含 KEY_NAME_IDENTIFIER
:
key_name_pattern
: KEY_NAME_IDENTIFIER
| KEY_NAME_PATTERN
| STRING_LITERAL
;