2015-08-04 1 views
0

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

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

+0

За исключением отсутствующего периода после производства «Формула», который, как я полагаю, является опечаткой здесь, SO, я не вижу никаких очевидных проблем. Какая ошибка вы получаете с помощью входа '_ * 5'? –

+0

@ 500-InternalServerError Добавлено обновление – fahadash

+0

Работает ли оно, если вы берете определения 'letter' и' identifier' (которые в настоящее время не указаны)? - Я думаю, что определение вашего «письма» может вызвать проблемы, так как оно включает символы между «Z» (верхний регистр) и «a» (строчный регистр). –

ответ

1

Ваше текущее определение маркеров letter вызывает этот вопрос, потому что диапазон A .. z включает _ характер и ^ характера.

0

Вы можете переписать формулу и Term правила, как это:

Formula = Formula ('+' | '-') Term | Term            

Term = Term ('*' | "/" |'%' | '^' ) Factor | Factor 

например https://metacpan.org/pod/distribution/Marpa-R2/pod/Marpa_R2.pod#Synopsis

+0

Coco/r не может обрабатывать левую рекурсию. –

+0

О, мой плохой. Спасибо что подметил это. – rns

Смежные вопросы