3

私のvbscript文法のこの部分を考慮してください

EXPR.Rule = BINARY_EXPR 
        | COMPARE_EXPR
        | AND_EXPR
        | OR_EXPR;

BINARY_EXPR.Rule = EXPR + BINARY_OP + EXPR + ReduceHere();
COMPARE_EXPR.Rule = EXPR + COMPARE_OP + EXPR + ReduceHere();
AND_EXPR.Rule = EXPR + "and" + EXPR;
OR_EXPR.Rule = EXPR + "or" + EXPR;

COMPARE_OP.Rule = ToTerm("=") | "<=" | ">=" | "<" | ">" | "<>";
BINARY_OP.Rule = ToTerm("+") | "&" | "^" | "-" | "*" | "/" | "\\";// | "=" | "<=" | ">=" | "<" | ">" | "<>" | "mod" | "and" | "or";

RegisterOperators(60, "^");
RegisterOperators(50, "*", "/", "\\", "mod");
RegisterOperators(40, "+", "-", "&");
RegisterOperators(30, "=", "<=", ">=", "<", ">", "<>");
RegisterOperators(20, "and", "or");

そしてこのvbscriptプログラム:

if 2=1+1 then x = 5

if (2=1)+1 then x = 5の代わりにこれを解析していif 2=(1+1) then x = 5ます。BINARY_EXPR以前に指定したことがありますCOMPARE_EXPR が、「+」は演算子の優先順位が高いため、最初に加算操作を探す必要があることを伝える方法がわかりません。これを他にどのように表現すれば、Irony が意図したとおりに解析できるでしょうか?

4

1 に答える 1

2

Ironyを使用したことはありませんが、その機能が提供されない場合(または、どのように機能するかがわからない場合)は、いつでもEXPR非終端記号を階層化することができます。

たとえば、足し算、引き算、掛け算、かっこ、比較だけを見てみましょう。

EXPR0.Rule = EXPR1
           | EXPR1 + "=" + EXPR1
           ;
EXPR1.Rule = EXPR2
           | EXPR1 + "+" + EXPR1
           | EXPR1 + "-" + EXPR2
           ;
EXPR2.Rule = EXPR3
           | EXPR2 + "*" + EXPR2
           ;
EXPR3.Rule = "(" + EXPR0 + ")"
           | USEVARIABLE
           | LITERAL
           ;

同じ優先順位を持つすべての演算子は、独自の階層に存在します。EXPR3に戻るループを提供するまで実行しない限り、左側または右側に優先順位の低い演算子を含めることはできませんEXPR0

"-"EXPR2右側にあることに注意してください。これは、が結合演算子であるのに対し、右結合演算子"+"であるためです。1 - 2 - 3常にとして解釈する必要がありますが、(1 - 2) - 3との1 + 2 + 3両方として解釈できます。私はVBに精通していないため、の結合性について何も言えません。そのため、VBを非結合にしました。(1 + 2) + 31 + (2 + 3)"="

繰り返しますが、私はあなたが使用しているフレームワークに精通していないので、構文が正しくない可能性があります;)

于 2013-01-01T21:23:05.530 に答える