LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Ещё немного упростил пример (наличие аргументов у функции не влияет на ошибку, поэтому выпилил их поддержку, точно также не влияет на ошибку выпил изменения приоритетов операций с помощью скобок).

<expression> ::= <expression> '<' <expression> | <expression> '(' ')' | NAME 

Тут есть важный момент - по идее я задаю приоритет '(' над '<' с помощью списка precedence.

Если описать грамматику вида:

<expression> ::= <expression> '+' <expression> | <expression> '*' <expression> | NAME

и точно также задать приоритет * над +, то выражение 2 + 2 * 2 парсится корректно (сначала умножение, потом сложение, а не наоборот).

Здесь NAME - последовательность из больших и малых латинских букв, цифр, знака подчёркивания и собаки. При этом начинающееся не с цифры и длинной не меньше 1 символа.

Помимо прочего PLY генерирует вот такой лог при построении дерева - http://pastebin.com/x5pzSEJh, но я недостаточно хорошо разбираюсь в вопросе, чтобы сделать по нему какие-либо выводы.

Исправление KivApple, :

Ещё немного упростил пример (наличие аргументов у функции не влияет на ошибку, поэтому выпилил их поддержку, точно также не влияет на ошибку выпил изменения приоритетов операций с помощью скобок).

<expression> ::= <expression> '<' <expression> | <expression> '(' ')' | NAME 

Тут есть важный момент - по идее я задаю приоритет '(' над '<' с помощью списка precedence.

Если описать грамматику вида:

<expression> ::= <expression> '+' <expression> | <expression> '*' <expression> | NAME

и точно также задать приоритет * над +, то выражение 2 + 2 * 2 парсится корректно (сначала умножение, потом сложение, а не наоборот).

Здесь NAME - последовательность из больших и малых латинских букв, цифр, знака подчёркивания и собаки. При этом начинающееся не с цифры и длинной не меньше 1 символа.

Исходная версия KivApple, :

Ещё немного упростил пример (наличие аргументов у функции не влияет на ошибку, поэтому выпилил их поддержку, точно также не влияет на ошибку выпил изменения приоритетов операций с помощью скобок).

<expression> ::= <expression> '<' <expression> | <expression> '(' ')' | NAME 

Тут есть важный момент - по идее я задаю приоритет '(' над '<' с помощью списка precedence.

Если описать грамматику вида:

<expression> ::= <expression> '+' <expression> | <expression> '*' <expression> | NAME

и точно также задать приоритет * над +, то выражение 2 + 2 * 2 парсится корректно (сначала умножение, потом сложение, а не наоборот).