Однозначная грамматика для арифметического выражения с Unary + и -
Я только начал самостоятельно изучать книгу Dragon Design of Compiler Design. Я работаю над проблемой, которая говорит, чтобы разработать грамматику для выражения, содержащего двоичные +,-,*,/ и унарные +, -
Я придумал
E -> E+T | E-T | T
T -> T*P | T/P | P
P -> +S | -S | S
S -> id | constant | (E)
Однако в этом есть очевидный недостаток. Согласно этой грамматике, выражения как
1--3
допустимы, что является ошибкой во всех языках программирования, которые я знаю. Хотя выражения вроде
1+-+3
and
1- -3
Должен быть действителен. Как можно создать такую грамматику?
3 ответа
Я считаю, что ваша проблема с токенизацией. Вы идентифицируете 1--3
как ошибка, потому что вы думаете, что это должно быть решено как 1 --3
скорее, чем 1 - -3
последнее совершенно верно. Поэтому я думаю, что ваша проблема возникает потому, что когда вы токенизируете полученную строку:
['1', '-', '-' , '3']
скорее, чем:
['1', '--', '3']
Я думаю, что у вас есть одно дополнительное правило производства
P -> +S | -S | S
S -> id | constant | (E)
может быть сокращен до
P -> +P | -P | id | constant | (E)
С такой грамматикой вы будете успешно соответствовать exp "1+-+3" как действительный.
У тебя есть tokenizer(scanner)
проблема! перед передачей токена парсеру Вы должны различать "-" и "-". Вы должны определить структуру токена, которая содержит тип и значение токена, а затем проанализировать список токенов. Также правило P->--S
должны быть добавлены в правила производства!