我试图解析ISO 8601 duation字符串(例如“P3M2D”)。请注意,这不允许嵌入空格。我正在使用antlr4.7
。
当我尝试使用词法分析器规则时
ISO8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我在ANTLR 4中不支持类似于“lexer规则中的标签的编译时警告;操作不能引用词法规则的元素,但是您可以使用getText()来获取与规则匹配的整个文本”< / em>的。 我想避免这种手动解析。
当我尝试使用解析器规则时
iso8601_INTERVAL
: 'P' ( y=NUMBER_INT 'Y' )? ( m=NUMBER_INT 'M' )? ( d=NUMBER_INT 'D' )?
| 'T' etc
;
我收到错误,例如“第8:39行不匹配输入'P2D'期待{'P'...” 是因为词法分析器期望令牌被WS分开吗?如果是,如何暂时暂停?
让antlr4解析持续时间输入部分的正确方法是什么?我对antlr或编译器很新。
答案 0 :(得分:1)
没有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] ;
正如你所看到的,我没有真正改变你的语法。那是因为我怀疑错误是在你的语法中的其他地方,但由于你还没有提供整个语法,我唯一能给你的就是这个小而且(希望)工作的独立语法。