我正在为一个中等大小的语言编写语法,我正在尝试实现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')
;
答案 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')
;
请记住,词法分析器和解析器是完全独立的。词法分析器确定将哪些令牌传递给解析器,然后解析器将它们分组。