Однозначная грамматика для арифметического выражения с Unary + и - - PullRequest
3 голосов
/ 14 июля 2011

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

Я придумал следующее

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 ]

2 голосов
/ 22 августа 2011

Я считаю, что ваша проблема с токенизацией. Вы идентифицируете 1--3 как ошибку, потому что вы думаете, что она должна быть решена как 1 --3, а не 1 - -3, причем последняя совершенно корректна. Поэтому я думаю, что ваша проблема возникает потому, что когда вы токенизируете полученную строку:

['1', '-', '-' , '3']

вместо:

['1', '--', '3']

0 голосов
/ 24 ноября 2016

У вас tokenizer(scanner) проблема!перед передачей токена парсеру Вы должны различать "-" и "-".Вы должны определить структуру токена, которая содержит тип и значение токена, а затем проанализировать список токенов.Также к правилам производства должно быть добавлено правило P->--S !!

0 голосов
/ 25 октября 2011

Я думаю, у вас есть одно дополнительное правило производства

P -> +S | -S | S
S -> id | constant | (E)

можно уменьшить до

P -> +P | -P | id | constant | (E)

С такой грамматикой вы успешно сопоставите exp "1 + - + 3" как действительный.

...