ANTLR:当其他数字文字也可能时,解析2位数字

时间:2009-05-20 07:02:44

标签: parsing antlr antlrworks

我正在为一个中等大小的语言编写语法,我正在尝试实现hh:mm:ss形式的时间文字。

但是,每当我尝试将12:34:56解析为timeLiteral时,我会在数字上得到不匹配的令牌异常。有谁知道我可能做错了什么?

以下是目前定义的相关规则:

timeLiteral
    :   timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*)
    ;

timePair
    :   DecimalDigit DecimalDigit
    ;

NumericLiteral
    : DecimalLiteral
    ;

fragment DecimalLiteral
    : DecimalDigit+ ('.' DecimalDigit+)?
    ;

fragment DecimalDigit
    : ('0'..'9')
    ;

1 个答案:

答案 0 :(得分:3)

问题是词法分析器正在吞噬DecimalDigit并返回NumericLiteral。

解析器永远不会看到DecimalDigits,因为它是一个片段规则。

我建议将timeLiteral移动到词法分析器中(将其名称大写)。所以你有类似

的东西
timeLiteral
    :   TimeLiteral -> ^(TIMELIT TimeLiteral*)
    ;

number
    :   DecimalLiteral
    ;

TimeLiteral
    :   DecimalDigit DecimalDigit COLON 
        DecimalDigit DecimalDigit COLON
        DecimalDigit DecimalDigit
    ;

DecimalLiteral
    :   DecimalDigit+ ('.' DecimalDigit+)?
    ;

fragment DecimalDigit
    :   ('0'..'9')
    ;

请记住,词法分析器和解析器是完全独立的。词法分析器确定将哪些令牌传递给解析器,然后解析器将它们分组。