2012-12-05 60 views
3

我得到了運行時信息:語法錯誤,意外VARIABLE,期待':'或'\ n' 我想這是由於我錯誤的野牛來源,但是怎麼回事? 在我的法源我有野牛錯誤報告解釋

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

但同時=四分之五十五運行正常,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); 
} 

回答

1

Flex/lex不支持單引號來表示字符串,爲此使用雙引號。因此,您的掃描儀實際上正在等待您輸入a=55'mod'4。刪除單引號或使用雙引號。

此外,不要在解析器的動作中使用yylval,使用$1等等。我不知道你的代碼是否有效,但如果是這樣的話,那純粹是運氣:yylval是關於lookahead的,它不需要和最後一個縮小的符號相同。

1

我的猜測是,你lex文件也有類似的規則:

在這種情況下
[[:digit:]]+    INTEGER 
[[:alpha:]][[:alnum:]]* VARIABLE 

MOD4將lexed作爲一個變量,而不是作爲MOD因爲lex總是選擇最長的匹配。

如果您不希望在輸入MOD後輸入空格,那麼您必須對指定VARIABLE的方式更加了解。