独自のアナライザー/パーサーを作成しようとしています。
なぜ機能しないのかは理解できますが、解決方法がわかりません。
これは私のパーサーの問題部分のコードです。
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 番目の選択肢を呼び出すため、これにアクセスできません。