为了账号安全,请及时绑定邮箱和手机立即绑定

如何访问 antlr golang 目标中的语法组件

如何访问 antlr golang 目标中的语法组件

Go
守着星空守着你 2022-07-11 17:11:24
访问通过语法规则传递的运算符值时出现编译错误。例如,我有以下语法文件:grammar Expr;@parser::header {import (    "os")}@parser::members {func eval(left int, op antlr.Token, right int) int {    if   (op.GetText() == "*") {        return left * right    } else if (op.GetText() == "+") {        return left + right    } else if (op.GetText() == "-") {        return left - right    } else {        return 0    }}}stat:   e NEWLINE    |   NEWLINE                       ;e returns [int v]    : a=e op=('+'|'-') b=e  {                $v = eval($a.v, $op, $b.v)                fmt.Fprintf(os.Stdout, "got args=%d %d\n", $a.v, $b.v)                }    | INT                   {                $v = $INT.int                fmt.Fprintf(os.Stdout, "got number=%d\n", $v)                }        ; MUL : '*' ;DIV : '/' ;ADD : '+' ;SUB : '-' ;ID  :   [a-zA-Z]+ ;      // match identifiersINT :   [0-9]+ ;         // match integersNEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)WS  :   [ \t]+ -> skip ; // toss out whitespace这是测试代码:package mainimport (    "os"    "./parser"    "github.com/antlr/antlr4/runtime/Go/antlr")func calc(inputfile string) {        input, _ := antlr.NewFileStream(inputfile)// Setup the input    lexer := parser.NewExprLexer(input)// Create the Lexer    stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)    p := parser.NewExprParser(stream)// Create the Parser        p.Stat()}func main() {    calc(os.Args[1])}这些是我运行的命令:java org.antlr.v4.Tool -Dlanguage=Go -o parser -no-listener Expr.g4go build expr_t.go以上2个程序正常工作。但是,如果我将 eval 函数的比较更改为以下内容,则会出现编译错误(类型不匹配):if   (op.tokenType == ExprParserMUL) {    return left * right如何获取 op 的值以与 ExprParseMUL 进行比较?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

if (op.tokenType == ExprParserMUL) {

    return left * right

如何获取 op 的值以与 ExprParseMUL 进行比较?


没有tokenType场。使用GetTokenType().


参见:https ://github.com/antlr/antlr4/blob/master/runtime/Go/antlr/token.go


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信