Bison 分析文件时出现错误

Bison 分析文件时出现错误,bison,Bison,我正在使用Bison和flex创建我的C编译器的语法。 在运行bisonflex和Gcc之后。一切都很好。 当运行解析器时。第一行输入正确工作;但在输入的第二行中,它抛出以下bison yyerrorerror消息: 分析错误,应为“$” 我没有带美元符号的代币 为了简单起见,我选择不显示y代码;但如果你需要看,我可以编辑。我只想知道这个错误消息的原因 编辑:添加野牛代码 %{ #include <string.h> #include <stdio.h> #includ

我正在使用Bison和flex创建我的C编译器的语法。 在运行bisonflex和Gcc之后。一切都很好。 当运行解析器时。第一行输入正确工作;但在输入的第二行中,它抛出以下bison yyerrorerror消息:

分析错误,应为“$”

我没有带美元符号的代币

为了简单起见,我选择不显示y代码;但如果你需要看,我可以编辑。我只想知道这个错误消息的原因

编辑:添加野牛代码


%{
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define YYERROR_VERBOSE

int yylex();
extern FILE *yyin;
int yyerror(char *s);
%}

%token T_abstract
%token T_alias
%token T_align
%token T_asm
%token T_assert
%token T_auto
%token T_body
%token T_bool
%token T_break
%token T_byte
%token T_case
%token T_cast
%token T_catch
%token T_cdouble
%token T_cent
%token T_cfloat  
%token T_char
%token T_class
%token T_const
%token T_continue
%token T_creal
%token T_dchar
%token T_debug
%token T_default
%token T_delegate
%token T_deprecated
%token T_do
%token T_double
%token T_eles
%token T_enum
%token T_export
%token T_extern
%token T_false
%token T_final
%token T_finally
%token T_float
%token T_for
%token T_foreach
%token T_foreach_reverse
%token T_function
%token T_goto
%token T_idouble
%token T_if
%token T_ifloat
%token T_immutable
%token T_import
%token T_in
%token T_inout
%token T_int
%token T_interface
%token T_invariant
%token T_ireal
%token T_is
%token T_lazy
%token T_long
%token T_mixin
%token T_module
%token T_new
%token T_nothrow
%token T_null
%token T_out
%token T_override
%token T_package
%token T_pragma
%token T_private
%token T_protected
%token T_public
%token T_pure
%token T_real
%token T_ref
%token T_return
%token T_scope
%token T_shared
%token T_short
%token T_static
%token T_struc
%token T_super
%token T_switch
%token T_synchronized
%token T_template
%token T_this
%token T_throw
%token T_true
%token T_try
%token T_typeid
%token T_typeof
%token T_ubyte
%token T_ucent
%token T_uint
%token T_ulong
%token T_union
%token T_unittest
%token T_ushort
%token T_version
%token T_void
%token T_wchar
%token T_while
%token T_with
%token NUM

%token T_neq 
%token T_bslash
%token T_land
%token T_andeq
%token T_and
%token T_lor
%token T_oreq
%token T_or
%token T_dec
%token T_deceq
%token T_minus
%token T_inc
%token T_inceq
%token T_plus
%token T_GEQ
%token T_GR
%token T_NOTEQ
%token T_OPAREN
%token T_CPAREN
%token T_OCOR   
%token T_CCOR
%token T_SEMICOLON
%token T_EQUAL
%token T_multiply
%token T_COMA
%token T_LE
%token T_isEqual
%token DEC
%token ID
%token T_LT


%right T_EQUAL
%left T_and T_or
%left T_LE T_GEQ T_NOTEQ T_isEqual T_GR T_LT

%start prog

%%
prog:   Function
    |Declaration
    ;

Declaration:    Type Assignment T_SEMICOLON 
        | Assignment T_SEMICOLON    
        | FunctionCall T_SEMICOLON   
        ;

Assignment:     ID T_EQUAL Assignment
        | ID T_EQUAL FunctionCall
        | ID T_plus Assignment
        | ID T_minus Assignment
        | ID T_multiply Assignment
        | ID T_bslash Assignment    
        | NUM T_plus Assignment
        | NUM T_minus Assignment
        | NUM T_multiply Assignment
        | NUM T_bslash Assignment
        | T_OPAREN Assignment T_CPAREN
        | T_minus T_OPAREN Assignment T_CPAREN
        | T_minus NUM
        | T_minus ID
        | NUM
        | DEC
        | ID
        ;

FunctionCall : ID T_OPAREN T_CPAREN
    | ID T_OPAREN Assignment T_CPAREN
    ;

Type:   T_int 
    | T_float
    | T_char
    | T_double
    ;

Function: Type ID T_OPAREN ArgListOpt T_CPAREN CompoundStmt 
    ;

ArgListOpt: ArgList
    |
    ;

ArgList:  ArgList T_COMA Arg
    | Arg
    ;

Arg:    Type ID
    ;

CompoundStmt:   T_OCOR StmtList T_CCOR
    ;

StmtList:   StmtList Stmt
        |
        ;

Stmt:   WhileStmt
    | Declaration
    | ForStmt
    | IfStmt
    | T_SEMICOLON
    ;

WhileStmt: T_while T_OPAREN Expr T_CPAREN Stmt  
    | T_while T_OPAREN Expr T_CPAREN CompoundStmt 
    ;

ForStmt:T_for T_OPAREN Expr T_SEMICOLON Expr T_SEMICOLON Expr T_CPAREN Stmt 
       | T_for T_OPAREN Expr T_SEMICOLON Expr T_SEMICOLON Expr T_CPAREN CompoundStmt 
       | T_for T_OPAREN Expr T_CPAREN Stmt 
       | T_for T_OPAREN Expr T_CPAREN CompoundStmt 
    ;

IfStmt : T_if T_OPAREN Expr T_CPAREN Stmt ;

Expr:   
    | ID T_LE ID 
    | ID T_GEQ ID
    | ID T_NOTEQ ID
    | ID T_isEqual ID
    | ID T_GR ID
    | ID T_LT ID
    ;
%%


#include<ctype.h>
int count=0;
int main(int argc, char *argv[])
{
    yyin = fopen(argv[1], "r");
    if(!yyparse())
        printf("\nParsing complete\n");

    else
        printf("\nParsing failed\n");

    fclose(yyin);
    fclose(yyin);
    return 0;
}
int yyerror(char *s) {
    printf("%s\n",s);
}    





触发此错误是因为语法坚持程序必须是一个函数或声明。如果输入包含两个内容,那么解析器将解析第一个内容,然后抱怨它期望输入结束


我猜你的bison版本表示EOF标记为$。或者您没有准确地引用错误消息。

如果没有看到您的代码,就不可能给出任何有用的建议。但在我看来,这不像是野牛的错误信息。你引用的是准确的吗?是的,这是yyerror函数的错误。我在问题上添加了我的代码。你确定这是你得到的准确错误消息吗?Bison错误消息通常以syntax error开始,而不是parse error,并且在设置verbose选项时,包含预期的和实际的令牌,而不仅仅是消息中预期的令牌。这一切让我觉得你是从记忆中重新输入了信息,而不是复制粘贴,这意味着你可能又犯了其他错误。可能真正的错误消息是$end而不是“$”。我不记得bison曾经产生过解析错误。我熟悉的版本会产生从语法错误开始的错误消息。也许替换是翻译的结果。