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

它将 this 解析为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这是因为它是一个右结合运算符,而"+"它是一个结合运算符。While1 - 2 - 3必须始终解释为(1 - 2) - 3,1 + 2 + 3可以同时解释为(1 + 2) + 3and 1 + (2 + 3)。我对 VB 不够熟悉,无法说明 的关联性"=",因此我将其设为非关联。

同样,我不熟悉您使用的框架,因此语法可能不正确;)

于 2013-01-01T21:23:05.530 回答