访问通过语法规则传递的运算符值时出现编译错误。例如,我有以下语法文件: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
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报
0/150
提交
取消