3

独自のアナライザー/パーサーを作成しようとしています。

なぜ機能しないのかは理解できますが、解決方法がわかりません。

これは私のパーサーの問題部分のコードです。

void Expression() : {}{
    Term() ((<PLUS> | <MINUS>) Term())*
}

void Term() : {}{
     Factor()((<MULTIPLY> | <DIVIDE>) Factor())*
}

void Factor() : {}{
    (<ID> | <NUMBER> | ((<PLUS> | <MINUS>)?<OPEN_PARENTHESIS> Expression() <CLOSE_PARENTHESIS>))
}

void Condition() : {}{
    (
        (<NOT> Condition()) |
        (<OPEN_PARENTHESIS> Condition() (<AND> | <OR>) Condition() <CLOSE_PARENTHESIS>) |
        (Expression() (<EQUAL_CHECK> | <NOT_EQUAL> | <LESS> | <LESS_EQUAL> | <GREATER> | <GREATER_EQUAL>) Expression())     
    )
}

ご覧のとおり、問題はOR セクションの 3 つのオプションのうち最後の 2 つのCondition()メソッド内にあります。これは、Expression()が最終的に "( Expression() )" になる可能性があるためです。したがって、3 番目と 2 番目のオプションの両方が開き括弧トークンで始まる可能性があります。

ただし、この問題をどのように解決するかはわかりません。以前のパーサーで同様の問題を解決しましたが、Expression() --> Term() --> Factor()の方法と問題コードがすべてFactor()メソッドのずっと下に。

アドバイスをいただければ幸いです。

ありがとう、

トーマス。

編集:

詳細については、このパーサーで動作するはずのコード例を提供しますが、上記のバグが原因で動作しません。

fun succesful_method()
    start
        var i = 1;
        if(i > 0 and i < 2)
        do
            i = 2;
        stop
    stop

start
    successful_method()
stop

上記のメソッドは、Condition()メソッドの 2 番目の代替手段を使用するため、正常に実行されます。

fun succesful_method()
    start
        var i = 1;
        if(i > 0)
        do
            i = 2;
        stop
    stop

start
    successful_method()
stop

上記のメソッドは、3 番目の選択肢を使用する必要があるため失敗しますが、'(' が原因でパーサーが 2 番目の選択肢を呼び出すため、これにアクセスできません。

4

2 に答える 2

1

これは、構文の先読みで解決できます。

void CompOp() : {} { <EQUAL_CHECK> | <NOT_EQUAL> | <LESS> | <LESS_EQUAL> | <GREATER> | <GREATER_EQUAL> }

void Condition() : {}{
        <NOT> Condition()
    |
        LOOKAHEAD(Expression() CompOp()) 
        Expression()
        CompOp()
        Expression()   
    |
        <OPEN_PARENTHESIS>
        Condition()
        (<AND> | <OR>)
        Condition()
        <CLOSE_PARENTHESIS>
}

(. _

void Condition() : {}{
        <NOT> Condition()
    |   LOOKAHEAD( <OPEN_PARENTHESIS> )
        (
            LOOKAHEAD(Expression() CompOp()) 
            Expression()
            CompOp()
            Expression() 
        |
            <OPEN_PARENTHESIS>
            Condition()
            (<AND> | <OR>)
            Condition()
            <CLOSE_PARENTHESIS>
        )
    |
        Expression()
        CompOp()
        Expression()   
}
于 2015-04-30T18:50:08.503 に答える