antlr4.7 如何解析像 "P3M2D" 这样的持续时间规范
antlr4.7 how to parse a duration spec like "P3M2D" for parts
我无法解析 ISO 8601 duation 字符串(例如 "P3M2D")。请注意,这不允许嵌入空格。我正在使用 antlr4.7
.
当我尝试使用词法分析器规则时
ISO8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我收到一个编译时警告,如 "labels in lexer rules are not supported in ANTLR 4; actions cannot reference elements of lexical rules but you can use getText() to get the entire text matched for the rule"。
我想避免这种手动解析。
当我尝试使用解析器规则时
iso8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我收到类似 "line 8:39 mismatched input 'P2D' expecting {'P'..." 的错误
是因为词法分析器期望标记被 WS 分隔吗?如果是,如何暂停?
让 antlr4 解析持续时间输入的部分的正确方法是什么?我对 antlr 或编译器比较陌生。
没有 ANTLR 不希望词法分析器标记由空格分隔。
根据您在问题中提供的内容,以下语法应该可以完成工作:
specs:
iso*
;
iso:
P (y=INT Y)? (m=INT M)? (d=INT D)?
;
P: 'P' ;
Y: 'Y' ;
M: 'M' ;
D: 'D' ;
INT: [0-9] ;
如你所见,我并没有真正改变你的语法。那是因为我怀疑错误出在你的语法的其他地方,但由于你没有提供整个语法,我唯一能给你的就是这个小但(希望)工作的独立语法。
我无法解析 ISO 8601 duation 字符串(例如 "P3M2D")。请注意,这不允许嵌入空格。我正在使用 antlr4.7
.
当我尝试使用词法分析器规则时
ISO8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我收到一个编译时警告,如 "labels in lexer rules are not supported in ANTLR 4; actions cannot reference elements of lexical rules but you can use getText() to get the entire text matched for the rule"。 我想避免这种手动解析。
当我尝试使用解析器规则时
iso8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我收到类似 "line 8:39 mismatched input 'P2D' expecting {'P'..." 的错误 是因为词法分析器期望标记被 WS 分隔吗?如果是,如何暂停?
让 antlr4 解析持续时间输入的部分的正确方法是什么?我对 antlr 或编译器比较陌生。
没有 ANTLR 不希望词法分析器标记由空格分隔。
根据您在问题中提供的内容,以下语法应该可以完成工作:
specs:
iso*
;
iso:
P (y=INT Y)? (m=INT M)? (d=INT D)?
;
P: 'P' ;
Y: 'Y' ;
M: 'M' ;
D: 'D' ;
INT: [0-9] ;
如你所见,我并没有真正改变你的语法。那是因为我怀疑错误出在你的语法的其他地方,但由于你没有提供整个语法,我唯一能给你的就是这个小但(希望)工作的独立语法。