0

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 行目、予期しないファイルの終わり

私が間違いを犯している場所で誰かが私を助けることができますか?

4

1 に答える 1

0

Berkeley yacc が utf-8 を認識しているとは思わないので、'Ɛ' をリテラルとして使用しても期待どおりに動作する可能性は低いです。しかし、あなたが何を期待しているのか正確にはわかりません。「空のプロダクション」を意味している可能性さえありますが、それは確かに空のプロダクションを yacc に説明する方法ではありません。Berkeley yacc v1.9 ( ) で試した1.9 20121003ところ、25 行目に Ɛ が無効な文字であるというエラー メッセージが表示されました。それを引用すると、そのエラーはなくなりました。

エラー メッセージは、ほとんど空のファイルを yacc に提供した場合に生成されるものです。質問に貼り付けたファイルは実際に という名前expy.ascですか? (ちなみに、yacc/bison の入力ファイルには通常、'.y' という接尾辞が付けられます。ただし、その規則は無視してかまいません)。

于 2013-10-31T04:29:42.440 に答える