语法中的 Antlr4-JS 动作:如何访问令牌和定义函数? (直接在 java 中,而不是在 JS 中)
Antlr4-JS actions in grammar: how to access tokens and define funcs ? (direct in java, not in JS)
我正在尝试适应 JS 目标 Expr.g4 of the book。
在这个例子中,动作直接在语法中。它们包括在@parser::members 中定义的实用函数,这些函数在规则中被调用。
该示例在 Java 中运行良好,但在其 JS 翻译中我有 2 个问题:
- 通过操作规则使操作函数可见
- 获取函数中识别的标记。
我终于设法得到了这个有效的公式:
@parser::members {
myeval = function(left, op, right) {
switch ( op ) {
case Expr_jsParser.MUL : return left * right;
case Expr_jsParser.DIV : return left / right;
case Expr_jsParser.ADD : return left + right;
case Expr_jsParser.SUB : return left - right;
}
return 0;
};
}
(myeval 是动作函数。MUL,DIV 等是语法标记。Expr_jsParser 是 Antlr 生成的 class)
我很确定有一种更简洁的方法可以做到这一点,不是吗?
Eric Vergnaud(Antlr 的 JS 专家)告诉我这是常规行为。简单地说,Java 接受跳过 Expr_jsParser
前缀,而 JS 不接受。
我正在尝试适应 JS 目标 Expr.g4 of the book。
在这个例子中,动作直接在语法中。它们包括在@parser::members 中定义的实用函数,这些函数在规则中被调用。
该示例在 Java 中运行良好,但在其 JS 翻译中我有 2 个问题:
- 通过操作规则使操作函数可见
- 获取函数中识别的标记。
我终于设法得到了这个有效的公式:
@parser::members {
myeval = function(left, op, right) {
switch ( op ) {
case Expr_jsParser.MUL : return left * right;
case Expr_jsParser.DIV : return left / right;
case Expr_jsParser.ADD : return left + right;
case Expr_jsParser.SUB : return left - right;
}
return 0;
};
}
(myeval 是动作函数。MUL,DIV 等是语法标记。Expr_jsParser 是 Antlr 生成的 class)
我很确定有一种更简洁的方法可以做到这一点,不是吗?
Eric Vergnaud(Antlr 的 JS 专家)告诉我这是常规行为。简单地说,Java 接受跳过 Expr_jsParser
前缀,而 JS 不接受。