lex & yacc 文件中的语法错误

Posted

技术标签:

【中文标题】lex & yacc 文件中的语法错误【英文标题】:Syntax error in lex & yacc file 【发布时间】:2017-01-12 14:48:22 【问题描述】:

我对 lex 和 yacc 还是很陌生。我正在尝试一种语法来识别输入文本:ESCREVER 1;ESCREVER 1+2; 但每次我尝试它都会显示语法错误,我认为问题在于解析数字或单词 ESCREVER

这是我的 flex/lex 代码

%
#include "gram.h"

int yyerror(const char *s);

%



/* letras [A-Za-z]+ */


/* id     (letras)(letras|digito)* */

%%

"ESCREVER" return   ESCREVER;                                 
"TERMINAR" return TERMINAR; 

[0-9]+      yylval.num =atoi(yytext);
             return NUM; 


[A-Za-z0-9]*  yylval.str=strdup(yytext);
                return TEXTO;


"/" | 
"-" |
"+" |
"*" |
"=" |
.          return yytext[0];
[ \n\t]      


%%


int yywrap() return 1; 

YACC 代码:

%

  #include <stdio.h>
  int yylex(void);
  int yyerror(const char *s);


%
%union
        char *str; /* para strings*/
        int num; /* para inteiros */
     

%token TERMINAR ESCREVER
%token SUBTRACAO 
%token MULTIPLICACAO 
%token DIVISAO 
%token SOMA
%token<num> NUM /*para inteiros*/
%token<str> TEXTO /*MUDAR PARA VAR*/
%type<num> elemento
%type<num> expr 
%type<num> lista
%start s

%%

s:linha s
 |TERMINAR ';' return 0;
 ;

linha: ESCREVER lista';' printf("%d",$2);                       
     | VARS
     ;

lista: lista ',' elemento
     | elemento
     ;

elemento:NUM
        |expr
        ;





VARS :
     | NUM 
     | TEXTO
     | expr
     | TEXTO '=' VARS ';' /* para delcaracoes */
     ;



expr     : NUM  SOMA expr                $$=$1+$3;
         | NUM  SUBTRACAO expr           $$=$1-$3;
         | NUM  MULTIPLICACAO expr       $$=$1*$3;
         | NUM  DIVISAO expr             $$=$1/$3;
     | NUM  '+' expr                 $$=$1+$3;
         | NUM  '=' expr                 $$=$1=$3;
         | NUM  '-' expr                  $$=$1-$3;
         | NUM  '*' expr                 $$=$1*$3;
         | NUM  '/' expr                  $$=$1/$3;
         | NUM                           $$=$1;   
         ;             


%%


int yyerror(char const *s) 
    fprintf(stderr,"Erro: %s\n",s); 
    return 0;


int main(int argc, char *argv[]) 
    extern FILE *yyin;

    if (argc > 1) 
        if((yyin=fopen(argv[1],"r"))==NULL)
            fprintf(stderr,"erro ao abrir o ficheiro \"%s\".\n",argv[1]);
            return 1;   
        
     else 
        printf("introduza comandos: \n");
    yyparse(); 
    return 0;

【问题讨论】:

【参考方案1】:

您的扫描仪规范中的这两行都匹配空间:

.          return yytext[0];
[ \n\t]      

当您键入ESCREVER 1; 时,空格由第一条规则解释。由于 Flex 按照编写顺序使用规则,因此您可以将忽略空白的规则向上移动,因此首先对其进行检查。

【讨论】:

以上是关于lex & yacc 文件中的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

YACC和LEX,在行尾获取语法错误,无法弄清楚原因

Yacc 与 Lex 快速入门(词法分析和语法分析)

Lex&YACC 编译错误:在 '.' 之前应为 ')'令牌

Lex Yacc 入门

Postgres数据库词法分析和语法分析源码解析

Postgres数据库词法分析和语法分析源码解析