antlr错误消息似乎是自相矛盾的?我做错了什么?

antlr error message seems self-contradictory? What am I doing wrong?

提问人:Dov 提问时间:8/26/2023 更新时间:8/26/2023 访问量:26

问:

我在文件 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,但这是一个错误?

解析 ANTLR4 语法

评论

1赞 kaby76 8/27/2023
你的 grammmar 有无用的括号。您应该删除它们。 -> , -> , -> .此外,除非您知道自己在做什么,否则起始规则应以 EOF 终止:。例如,它将接受 .( 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, }

答:

1赞 Bart Kiers 8/26/2023 #1

词法分析器使用以下 2 个规则创建令牌:

  1. 尝试匹配尽可能多的字符
  2. 当 2 个(或更多)规则匹配相同的字符时,让第一个定义的规则“获胜”

由于规则 2,输入被标记为标记,而不是标记。解决方案:将规则移到所有规则下方,并设置规则:f32IDENTF32IDENTU...F...

STRUCT: 'struct' ;

U8: 'u8' ;
U16: 'u16' ;
U32: 'u32' ;
U64: 'u64' ;

F32: 'f32' ;
F64: 'f64' ;

IDENT: [a-zA-Zα-ωΑ-ΩА-Яа-я][a-zA-Z0-9_α-ωΑ-ΩА-Яа-я]* ;