Я пытаюсь использовать SableCC для создания Parser для моделей, которые я называю LAM. LAM в себе простой и простая грамматика (где я много чего опускаю) для них:Изменение схемы ассоциативности в грамматике
L := 0 | (x,y) | F(x1,...,xn) | L || L | L ; L
Я написал эту грамматику:
Helpers
number = ['0' .. '9'] ;
letter = ['a' .. 'z'] ;
uletter = ['A' .. 'Z'] ;
Tokens
zero = '0' ;
comma = ',' ;
parallel = '||' ;
point = ';' ;
lpar = '(' ;
rpar = ')' ;
identifier = letter+ number* ;
uidentifier = uletter+ number* ;
Productions
expr = {term} term |
{parallel} expr parallel term |
{point} expr point term;
term = {parenthesis} lpar expr rpar |
{zero} zero |
{invk} uidentifier lpar paramlist rpar |
{pair} lpar [left]:identifier comma [right]:identifier rpar ;
paramlist = {list} list |
{empty} ;
list = {var} identifier |
{com} identifier comma list ;
В основном это работает, но есть побочный эффект: он левый ассоциативный. Например, если у меня есть
L = L1 || L2 ; L3 || L4
Тогда он обрабатывается как:
L = ((L1 || L2) ; L3) || L4
Я хочу, чтобы дать все приоритет на «;» оператор, и поэтому имеет L разобраны как
L = (L1 || L2) ; (L3 || L4)
(другие вещи, как "||", может по-прежнему левоассоциативный)
Моих вопросов:
- Есть советы, чтобы сделать такие преобразования «автоматизированы»?
- Как могла быть грамматика со всеми приоритетами на ";" ?
Принята также «RTFM» ссылка :-D Спасибо всем
Это полезно. Поэтому мне в основном нужно создать иерархию, где операторы с большим приоритетом находятся поверх этой иерархии. – kronat
@kronat Операторы с приоритетом * lower * вернутся в иерархию. – Apalala