Экспонент оператора не работает, когда не добавлено пробела? Что не так с моей грамматикой

Я пытаюсь написать оценщик выражений, в котором я пытаюсь добавить подчеркивание _ в качестве резервного слова, которое будет обозначать определенное постоянное значение.

Вот моя грамматика, она успешно разбирается 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

Другие вопросы по тегам