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ありがとうございます