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

访问通过语法规则传递的运算符值时出现编译错误。例如,我有以下语法文件:


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 identifiers

INT :   [0-9]+ ;         // match integers

NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)

WS  :   [ \t]+ -> skip ; // toss out whitespace

这是测试代码:


package main


import (

    "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.g4

go build expr_t.go

以上2个程序正常工作。但是,如果我将 eval 函数的比较更改为以下内容,则会出现编译错误(类型不匹配):


if   (op.tokenType == ExprParserMUL) {

    return left * right

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


守着星空守着你
浏览 100回答 1
1回答

狐的传说

if (op.tokenType == ExprParserMUL) {    return left * right如何获取 op 的值以与 ExprParseMUL 进行比较?没有tokenType场。使用GetTokenType().参见:https ://github.com/antlr/antlr4/blob/master/runtime/Go/antlr/token.go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go