Экспонент оператора не работает, когда не добавлено пробела? Что не так с моей грамматикой
Я пытаюсь написать оценщик выражений, в котором я пытаюсь добавить подчеркивание _ в качестве резервного слова, которое будет обозначать определенное постоянное значение.
Вот моя грамматика, она успешно разбирается 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.
2 ответа
Решение
Ваше текущее определение токена letter
вызывает эту проблему, потому что диапазон A
..z
включает в себя _
характер и ^
персонаж.
Вы можете переписать правила Formula и Term следующим образом:
Formula = Formula ( '+' | '-') Term | Term
Term = Term ( '*' | "/" |'%' | '^' ) Factor | Factor
например, https://metacpan.org/pod/distribution/Marpa-R2/pod/Marpa_R2.pod#Synopsis