Parsing 更改语法中的关联性模式

Parsing 更改语法中的关联性模式,parsing,grammar,context-free-grammar,sablecc,Parsing,Grammar,Context Free Grammar,Sablecc,我试图使用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

我试图使用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 = (L1 || L2) ; (L3 || L4)
(其他事物,如“| |”,可以保持左联想)

我的问题是:

  • 有一些以“自动”方式进行此类转换的技巧吗
  • 一个语法怎么可能在“;”上有优先权
  • 也接受“RTFM链接”:-D
    谢谢大家

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

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

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

    这很有用。所以我基本上需要建立一个层次结构,其中优先级较高的运算符位于该层次结构的顶部。@kronat优先级较低的运算符在层次结构中处于较高的位置。