【问题标题】:yacc: e - unexpected end-of-fileyacc: e - 意外的文件结尾
【发布时间】:2013-10-30 16:53:29
【问题描述】:

我正在编写一个 yacc 输入文件。这是我的代码

%{
    #include "stdio.h"
    #include "string.h"
    #include "exph.asc"
%}

%union {
    int value;
    struct symtab *symlink;
}

%token NAME
%token EXPR

%%

x
    : x dot
    | x p
    | x index
    | x b
    ;

b
    : '[' EXPR ']' b1 | Ɛ 
    ;

b1
    : '[' EXPR ']'
    Ɛ
    ;

dot
    : '.' NAME { $$= $2->value; $2->initialized = YES; }
    ;

index
    : '[' EXPR ':' EXPR ']'
    ;

p
    : '(' p
    | NAME p1 { $$= $1->value; }
    ;

p1 
    : ',' p
    | ')'
    | Ɛ
    ;

x
    : NAME { $$= $1->value; $1->initialized = YES; }
    ;

%%

struct symtab *symlook(char *str) {
    char *p;

    struct symtab *sp;

    for(sp = symtab; sp< &symtab[MAX_SYM]; sp++){
        if(sp->name && !strcmp(sp->name,str)) /* return pointer */
            return sp;

        if(!sp->name) { /* create new variable */
            sp->name = strdup(str);
            sp->initialized = NO;
            return sp;
        } 
    }
}

main()
{
    return(yyparse());
}

yyerror(s)
char *s;
{ 
    fprintf(stderr, "%s\n",s);
}

yywrap()
{
    return(1);
}

当我使用 yacc 编译这段代码时,我得到了这个错误

yacc: e - "expy.asc" 的第 1 行,意外的文件结尾

谁能帮我解决我的错误?

【问题讨论】:

  • 看起来Ɛ需要一些单引号:'Ɛ'。 symlook 也应该总是返回一个值
  • 嗨 Matthew Mcveigh 我尝试了用单引号括起来 Ɛ 的代码。但仍然有同样的问题(文件意外结束)

标签: context-free-grammar


【解决方案1】:

我认为 Berkeley yacc 不支持 utf-8,因此使用 'Ɛ' 作为文字不太可能按您预期的方式工作。但是,我不确定您的期望是什么。甚至有可能您的意思是“空产品”,但这肯定不是您向 yacc 描述空产品的方式。当我尝试使用 Berkeley yacc v1.9 (1.9 20121003) 时,我在第 25 行收到一条错误消息,抱怨 Ɛ 是一个无效字符;引用它确实使该错误消失了。

如果您向 yacc 提供一个几乎为空的文件,则会产生该错误消息。您粘贴到问题中的文件实际上是否称为expy.asc? (顺便说一下,yacc/bison 输入文件通常带有“.y”后缀。但您可以随意忽略该约定)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多