我正在尝试使用 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 谢谢大家