Однозначная грамматика для арифметического выражения с 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 должны быть добавлены в правила производства!

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