2013-02-11 4 views
0

Я пытаюсь использовать 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) 

(другие вещи, как "||", может по-прежнему левоассоциативный)

Моих вопросов:

  1. Есть советы, чтобы сделать такие преобразования «автоматизированы»?
  2. Как могла быть грамматика со всеми приоритетами на ";" ?

Принята также «RTFM» ссылка :-D Спасибо всем

ответ

0

Вам нужно создать иерархию правил, соответствующую нужный приоритет оператора.

expr = {subexp} subexp | 
     {parallel} subexp parallel expr ; 

subexp = {term} term | 
     {point} term point subexp; 

Обратите внимание, что я также изменил ассоциативность.

+0

Это полезно. Поэтому мне в основном нужно создать иерархию, где операторы с большим приоритетом находятся поверх этой иерархии. – kronat

+0

@kronat Операторы с приоритетом * lower * вернутся в иерархию. – Apalala

Смежные вопросы