Изменение схемы ассоциативности в грамматике

Я пытаюсь использовать SableCC для создания парсера для моделей, который я называю 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 link" :-D Всем спасибо


person kronat    schedule 11.02.2013    source источник


Ответы (1)


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

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

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

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

person Apalala    schedule 11.02.2013
comment
Это полезно. Поэтому мне в основном нужно создать иерархию, в которой операторы с более высоким приоритетом находятся на вершине этой иерархии. - person kronat; 12.02.2013
comment
@kronat Операторы с более низким приоритетом идут выше в иерархии. - person Apalala; 12.02.2013