我正在为中等大小的语言编写语法,并且正在尝试实现 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/