我正在尝试编写一个表达式求值器,我试图在其中添加下划线_作为保留字,该保留字表示某个常量值。
这是我的语法,它成功地解析了5 ^ _
,但它无法解析_^ 5
(没有空格)。
COMPILER Formula
CHARACTERS
digit = '0'..'9'.
letter = 'A'..'z'.
TOKENS
number = digit {digit}.
identifier = letter {letter|digit}.
self = '_'.
IGNORE 'r' + 'n'
PRODUCTIONS
Formula = Term{ ( '+' | '-') Term}.
Term = Factor {( '*' | "/" |'%' | '^' ) Factor}.
Factor = number | Self.
Self = self.
END Formula.
我错过了什么?我正在使用Coco/R编译器生成器。
您当前对令牌letter
的定义导致此问题,因为范围A
..z
包括_
字符和^
字符
你可以这样重写公式和术语规则:
Formula = Formula ( '+' | '-') Term | Term
Term = Term ( '*' | "/" |'%' | '^' ) Factor | Factor
。https://metacpan.org/pod/distribution/Marpa-R2/pod/Marpa_R2.pod简介