在语法中更改关联模式

时间:2013-02-11 12:27:24

标签: parsing grammar context-free-grammar sablecc

我正在尝试使用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. 怎么可能是一个具有所有优先权的语法“;” ?
  3. 它也被接受“RTFM链接”:-D 谢谢大家

1 个答案:

答案 0 :(得分:0)

您需要创建与所需运算符优先级匹配的规则层次结构。

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

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

请注意,我也更改了关联性。