Проблема yacc в golang: синтаксическая ошибка: неожиданный конец $ - PullRequest
0 голосов
/ 20 февраля 2019

Сердечное приветствие.

Я изучаю yacc в golang и создал этот файл:

%{

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
}

, но при его выполнении я получаю эту ошибку:

синтаксическая ошибка: синтаксическая ошибка: неожиданный конец $, ожидание DB или OTHER_DB

Я тестировал этот файл yacc с этим кодом:

package main

import (
    "fmt"
)

func main() {

    res := Parse("db")
    fmt.Println(res)
}

Чтоэто может быть?Нужно ли мне что-нибудь еще в файле yacc?

Я пытаюсь сделать очень простой, полностью функциональный пример, чтобы хорошо его понять.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 20 февраля 2019

Когда вашему синтаксическому анализатору необходимо узнать, каким является следующий символ ввода («токен»), он вызывает метод yyLexer Lex.Ваша реализация этого не делает попытки прочитать токен.Вместо этого он просто возвращает 0:

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

Так что с точки зрения синтаксического анализатора ему дается пустой входной поток, независимо от того, какой ввод вы могли бы фактически предоставить.Затем он пытается проанализировать этот пустой ввод, но ваша грамматика не позволяет этого.Единственные допустимые входные данные начинаются с токенов DB или OTHER_DB, и он не видит ни одной из этих вещей.

Таким образом, он выдает сообщение об ошибке, подробно описывающее, в чем заключается его проблема.(Синтаксический анализатор представляет конец ввода с внутренним псевдо-токеном $end, если это вас смущало.)

...