История изменений
Исправление 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 парсится корректно (сначала умножение, потом сложение, а не наоборот).