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

标签 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')
    ;

最佳答案

问题在于词法分析器正在吞噬 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')
    ;

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

关于parsing - ANTLR:当其他数字文字也可能时解析 2 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886511/

相关文章:

javascript - 使用 PEG.js 解析此语法的意外行为

antlr - Antlr 3.2重写规则

return-value - 如何处理ANTLR中的列表返回值

c - if 语句不适用于我的语法

c++ - SAX 在 C++ 中解析用户对象的片段?

ANTLR4 : clean grammar and tree with keywords (aliases ? )

parsing - 有人能模仿R2中的find/any行为吗?

java - ANTLR 可以生成最终的解析器类吗?

parsing - 编写一个可在 8 位嵌入式系统上使用的解析器,例如 Flex/Bison

php - 用于解析 HTML 的 DOMDocument(而不是正则表达式)