yacc:e - 意外的文件结束

时间:2013-10-30 16:53:29

标签: context-free-grammar

我正在写一个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行,意外的文件结尾

任何人都可以在我犯错的地方帮助我吗?

1 个答案:

答案 0 :(得分:0)

我不认为Berkeley yacc对utf-8有所了解,因此使用'Ɛ'作为文字的可能性不会像你期望的那样工作。但是,我完全不确定你的期望。甚至有可能你的意思是“空的生产”,但这肯定不是你如何描述一个空的生产到yacc。当我尝试使用Berkeley yacc v1.9(1.9 20121003)时,我在第25行收到一条错误消息,抱怨Ɛ是一个无效字符;引用它确实会让错误消失。

如果您向yacc提供几乎为空的文件,则会生成错误消息。您粘贴到问题中的文件实际上是expy.asc吗? (顺便提一下,yacc / bison输入文件的后缀通常都是'。''。但是你可以自由地忽略这个约定。)