提问人:Dov 提问时间:8/26/2023 更新时间:8/26/2023 访问量:26
antlr错误消息似乎是自相矛盾的?我做错了什么?
antlr error message seems self-contradictory? What am I doing wrong?
问:
我在文件 xbf.g4 中有以下 antlr4 语法
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\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'}
所以它应该包括 f32 在内的符号之一,它找到 f32,但这是一个错误?
答:
1赞
Bart Kiers
8/26/2023
#1
词法分析器使用以下 2 个规则创建令牌:
- 尝试匹配尽可能多的字符
- 当 2 个(或更多)规则匹配相同的字符时,让第一个定义的规则“获胜”
由于规则 2,输入被标记为标记,而不是标记。解决方案:将规则移到所有规则下方,并设置规则:f32
IDENT
F32
IDENT
U...
F...
STRUCT: 'struct' ;
U8: 'u8' ;
U16: 'u16' ;
U32: 'u32' ;
U64: 'u64' ;
F32: 'f32' ;
F64: 'f64' ;
IDENT: [a-zA-Zα-ωΑ-ΩА-Яа-я][a-zA-Z0-9_α-ωΑ-ΩА-Яа-я]* ;
评论
( struct_def )*
struct_def*
( type_uint | type_float | type_string )
type_uint | type_float | type_string
( member )*
member*
prog : struct_def*;
prog : struct_def* EOF;
struct vec { x : f32, } xstruct as { dd : dsf, }