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

4

1 に答える 1

0

目的の演算子の優先順位に一致するルールの階層を作成する必要があります。

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

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

結合性も変更したことに注意してください。

于 2013-02-11T14:21:30.593 に答える