簡體   English   中英

Golang中的問題yacc:語法錯誤:意外的$ end

[英]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文件中還需要其他內容嗎?

我試圖做一個非常簡單,功能齊全的例子來很好地理解它。

謝謝你的時間。

當您的解析器需要知道下一個輸入符號(“令牌”)是什么時,它將調用yyLexerLex方法。 您的實現不會嘗試讀取令牌。 相反,它只返回0:

func (f *mlex) Lex(lval *yySymType) int {
    yyErrorVerbose = true
    return 0
}

因此,從解析器的角度來看,無論您實際上提供了什么輸入,都將為它提供空的輸入流。 然后,它嘗試解析此空輸入,但是您的語法不允許這樣做。 唯一有效的輸入以令牌DBOTHER_DB ,並且看不到其中任何一個。

因此,它會生成錯誤消息,並詳細說明問題所在。 (解析器使用內部偽令牌$end表示輸入的$end ,以防使您感到困惑。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM