ANTLR4报错信息矛盾?我的xbf.g4语法文件哪里出错了?
ANTLR4语法解析矛盾报错原因分析
问题场景
自定义ANTLR4语法文件(xbf.g4)
grammar xbf; prog: ( struct_def )* ; type: ( type_uint | type_float | type_string ) ; type_uint: U8 | U16 | U32 | U64 ; type_float: F32 | F64 ; type_string: '"' STRLIT? '"' ; struct_def: STRUCT IDENT '{' ( member )* '}' ; member: IDENT ':' type ',' ; STRUCT: 'struct' ; IDENT: [a-zA-Zα-ωΑ-ΩА-Яа-я][a-zA-Z0-9_α-ωΑ-ΩА-Яа-я]* ; U8: 'u8' ; U16: 'u16' ; U32: 'u32' ; U64: 'u64' ; F32: 'f32' ; F64: 'f64' ; STRLIT: '"' (~["\r\n] | '\\"')* '"' ; WS: [ \t\r\n]+ -> skip;
测试输入文件
struct vec3d { x : f32, y : f32, z : f32, }
报错信息
line 2:6 mismatched input 'f32' expecting {'"', 'u8', 'u16', 'u32', 'u64', 'f32', 'f64'} line 3:6 mismatched input 'f32' expecting {'"', 'u8', 'u16', 'u32', 'u64', 'f32', 'f64'} line 4:6 mismatched input 'f32' expecting {'"', 'u8', 'u16', 'u32', 'u64', 'f32', 'f64'}
原因分析
ANTLR4的词法分析遵循两个核心规则:
- 最长匹配原则:优先匹配最长的符合规则的字符串
- 规则优先级:在长度相同的情况下,先定义的词法规则优先级更高
你的语法中,IDENT规则定义在U8、F32等关键字规则之前,而f32完全符合IDENT的匹配模式(以字母开头,后续为字母/数字/下划线)。词法分析器会把f32识别为IDENT符号,而非F32符号。但语法规则type期望的是F32这类关键字符号,所以就出现了“报错信息里显示期望包含f32,但实际输入的f32被识别成了不符合要求的IDENT”的矛盾情况。
解决方法
将所有关键字类的词法规则(STRUCT、U8、U16、U32、U64、F32、F64)移动到IDENT规则之前,让词法分析器优先匹配这些关键字,避免被IDENT规则误识别。调整后的词法规则部分如下:
STRUCT: 'struct' ; U8: 'u8' ; U16: 'u16' ; U32: 'u32' ; U64: 'u64' ; F32: 'f32' ; F64: 'f64' ; IDENT: [a-zA-Zα-ωΑ-ΩА-Яа-я][a-zA-Z0-9_α-ωΑ-ΩА-Яа-я]* ;
内容的提问来源于stack exchange,提问作者Dov
相关产品推荐
相关产品推荐

