野牛错误报告解释

时间:2012-12-05 00:39:18

标签: bison

我收到了运行时消息:语法错误,意外VARIABLE,期待':'或'\ n' 我想这是由于我错误的野牛来源,但是怎么回事? 在我的lex源代码中我有

'mod'       return MOD;
[-+()=/*\n:]    { return *yytext; }

但是当a = 55/4运行正常时,a = 55mod4退出并且之前写入了错误报告。 感谢任何预约。 这是我的完整野牛文件:

%{
    #include <stdio.h>
    void yyerror(char *);
    int yylex(void);
    #include "y.tab.h"
    #include "bas.h"

    #define YYDEBUG 1
    #define YYERROR_VERBOSE 1
    #define YYTOKEN_TABLE 1
%}
%debug
%error-verbose
%token INTEGER VARIABLE PRINT
%left '+' '-'
%left '*' '/'
%left MOD
%%
program:
    program statement ':'       {
                        if (stackptr>0)
                            {
                            printf("stack underflow !\n");
                            }
                        else if (stackptr<0)
                            {
                            printf("stack overflow !\n");
                            }
                        }
    |
        program statement '\n'      {
                        if (stackptr>0)
                            {
                            printf("stack underflow !\n");
                            }
                        else if (stackptr<0)
                            {
                            printf("stack overflow !\n");
                            }
                        else    {
            /* send basictoken[] array to micro*/
                            printf("OK.\n");
                            debugprint();
                            }
                        resetbuffer();
                    stackptr=0;                     
                        }
        | /* NULL */
        ;
statement:
        expression
        | VARIABLE '=' expression       {
                        put_token(avr_tovar);
                        put_token($1);
                        stackptr--;
                        }
        | PRINT expression      {
                        put_token(avr_tos);
                        stackptr--;
                        }
        ;
expression:
    INTEGER             {
                    put_token(avr_const);
                    put_token(yylval);
                    stackptr++;
                        }
        | VARIABLE              {
                        put_token(avr_fromvar);
                        put_token(yyval);
                        stackptr++;
                            }
        | expression '+' expression     {
                        put_token(avr_add);                     
                        stackptr--;
                            }
        | expression '-' expression     {
                        put_token(avr_sub);                     
                        stackptr--;
                        }
        | expression '*' expression     {
                        put_token(avr_mul);                     
                        stackptr--;
                        }
        | expression '/' expression     {
                        put_token(avr_div);                     
                        stackptr--;
                        }
        | expression MOD expression     {
                        put_token(avr_mod);                     
                        stackptr--;
                        }
        | '(' expression ')'
        ;
%%
void yyerror(char *s)
{
    fprintf(stderr, "%s\n", s);
}

2 个答案:

答案 0 :(得分:1)

我的猜测是你的lex文件也有以下规则:

[[:digit:]]+             INTEGER
[[:alpha:]][[:alnum:]]*  VARIABLE

在这种情况下MOD4将被定义为VARIABLE,而不是MOD,因为lex总是选择最长的匹配。

如果您不希望在输入中添加MOD之后的空格,则必须更加明确指定VARIABLE的方式。

答案 1 :(得分:1)

Flex / lex不支持单引号来表示字符串,它为此使用双引号。因此,您的扫描仪实际上正在等待您输入a=55'mod'4。删除单引号,或使用双引号。

此外,请勿在解析器的操作中使用yylval,请使用$1等。我不知道你的代码是否有效,但如果确实如此,那就是纯粹的运气:yylval是关于前瞻的,它不需要与最后一个简化符号相同。