2013-02-11 34 views
0

我正在嘗試使用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鏈接」 :-D 謝謝大家

回答

0

您需要創建一個規則層次結構所需的運算符優先級相匹配。

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

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

請注意,我也改變了關聯性。

+0

這很有用。所以我基本上需要建立一個層次結構,其中具有更高優先級的運算符位於該層次結構之上。 – kronat 2013-02-11 20:18:28

+0

@kronat具有* lower *優先級的運算符在層次結構中位於較高位置。 – Apalala 2013-02-12 00:40:38