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)
(其它事情,比如 「||」,可能仍然是左結合)
我的問題是:
- 有提示做這種轉換以「自動化」的方式進行?
- 怎麼可能是一個語法與所有優先的「;」 ?
它也接受了「RTFM鏈接」 :-D 謝謝大家
這很有用。所以我基本上需要建立一個層次結構,其中具有更高優先級的運算符位於該層次結構之上。 – kronat 2013-02-11 20:18:28
@kronat具有* lower *優先級的運算符在層次結構中位於較高位置。 – Apalala 2013-02-12 00:40:38