antlr4.7如何解析部件的持续时间规格,如“P3M2D”

时间:2017-12-10 03:38:56

标签: antlr4

我试图解析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或编译器很新。

1 个答案:

答案 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] ;

正如你所看到的,我没有真正改变你的语法。那是因为我怀疑错误是在你的语法中的其他地方,但由于你还没有提供整个语法,我唯一能给你的就是这个小而且(希望)工作的独立语法。