基本上重復了如何在antlr golang目標中訪問語法組件的所有內容。
我有以下的語法檔案:
我有以下的語法檔案。
grammar Expr;
@parser::header {
import (
"os"/span>
)
}
@parser::members {
func eval( left int, op antlr. Token, right int) int {
if (op.GetText() == "*"/span>) {
return left * right
} else if (op.GetText() == " ") {
return left right
} else if (op.GetText() == "-") {
return left - right
} else {
return 0 ?
}
}
}
stat: e NEWLINE
;
e回傳[int v] 。
: a=e op=(' '/span>|'-'/span>) b=e {
$v = eval($a.v, $op, $b.v)
fmt.Fprintf(os.Stdout, "got args=%d %d
", $a.v, $b.v)
}
| INT {
$v = $INT.int。
fmt.Fprintf(os.Stdout, "got number=%d
", $v)
}
;
MUL : '*'/span> ;
DIV : '/' ;
ADD : ' ' 。
SUB : '-' 。
ID : [a-zA-Z] ; //match identifiers 0-9] ; //匹配整數。
NEWLINE:'
'/span>? '
'; //向決議器回傳換行線(是結束陳述句的信號)。
WS : [ ] -> skip ; // toss out whitespace
而這是測驗代碼:
package main
import (
"os"/span>
"./parser"/span>
"github.com/antlr/antlr4/runtime/Go/antlr"/span>
)
func calc(inputfile string){
input, _ := antlr.NewFileStream(inputfile)//設定輸入。
lexer := parser.NewExprLexer(input)//創建詞典。
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個程式作業正常。然而,如何列印最后的輸出?我試著用這個方法,但沒有成功:
stat: e NEWLINE {
$v = $e.int "=%d
", $v)
}
| NEWLINE
;
我瀏覽了The ANTLR Mega Tutorial的整個部分,但沒能找到有關方面的細節。
uj5u.com熱心網友回復:
e規則回傳一個叫做v的值:
e returns [int v] 。
: ...
| ...
;
因此,你不應該做$e.int,而應該做$e.v:
stat
: e NEWLINE { fmt.Printf("=%d
", $e.v)
| NEWLINE
;
但是,你也可以讓入口規則stat回傳一個值:
stat returns [int v] 。
: a=e NEWLINE {$v = $a.v} | NEWLINE {$v = <$a.v
| NEWLINE {$v = 0}。
然后在你的代碼中做這樣的事情:
func calc(inputfile string) {
input, _ := antlr.NewFileStream(inputfile)
lexer := parser.NewExprLexer(input)
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
p := parser.NewExprParser(stream)
result := p.Stat()
fmt.Fprintf(os.Stderr, "%s"/span>, result.GetText()
fmt.Printf("%d
", result.GetV())
}
代碼測驗正常。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329378.html
標籤:
