[英]Problem yacc in golang: syntax error: unexpected $end
親切的問候。
我正在golang中學習yacc,並創建了以下文件:
%{
package main
import (
"fmt"
)
%}
%union{
ex string
}
%token <ex> DB OTHER_DB
%%
query: other
|
db
;
db: DB
{
fmt.Printf("\tDB: %s\n", $1 )
}
;
other: OTHER_DB
{
fmt.Printf("\tOTHER_DB: %s\n", $1 )
}
;
%%
type mlex struct {
expr string
result int
}
func (f *mlex) Lex(lval *yySymType) int {
yyErrorVerbose = true
return 0
}
func (f *mlex) Error(s string) {
fmt.Printf("syntax error: %s\n", s)
}
func Parse(expr string) int {
m := &mlex{expr, 0}
yyParse(m)
return m.result
}
但是執行它時出現此錯誤:
語法錯誤:語法錯誤:意外的$ end,需要DB或OTHER_DB
我一直在使用以下代碼測試此yacc文件:
package main
import (
"fmt"
)
func main() {
res := Parse("db")
fmt.Println(res)
}
會是什么呢 ? yacc文件中還需要其他內容嗎?
我試圖做一個非常簡單,功能齊全的例子來很好地理解它。
謝謝你的時間。
當您的解析器需要知道下一個輸入符號(“令牌”)是什么時,它將調用yyLexer
的Lex
方法。 您的實現不會嘗試讀取令牌。 相反,它只返回0:
func (f *mlex) Lex(lval *yySymType) int {
yyErrorVerbose = true
return 0
}
因此,從解析器的角度來看,無論您實際上提供了什么輸入,都將為它提供空的輸入流。 然后,它嘗試解析此空輸入,但是您的語法不允許這樣做。 唯一有效的輸入以令牌DB
或OTHER_DB
,並且看不到其中任何一個。
因此,它會生成錯誤消息,並詳細說明問題所在。 (解析器使用內部偽令牌$end
表示輸入的$end
,以防使您感到困惑。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.