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 文件中的语法错误的主要内容,如果未能解决你的问题,请参考以下文章