问题描述
我正在为解析器(语法分析器)编写代码。我收到错误消息,但我不知道是什么原因引起的。
Syntax_analyzer.y
%{
#include<stdio.h>
#include<stdlib.h>
extern void yyerror(char *);
extern FILE *yyin;
extern int yylineno;
extern char *yytext;
%}
%token FOR EQUAL INC DEC alpha num GE LE GT LT NE AND OR END IF ELSE WHILE DO SWITCH CASE BREAK DEFAULT VOID INT FLOAT CHAR SHORT DOUBLE
%token LPAREN RPAREN LCURLY RCURLY COMMA SEMICOLON ASSIGN
%token PLUS MINUS MULT DIVIDE XOR
%left PLUS MINUS MULT DIVIDE
%right ASSIGN
%right XOR
%nonassoc UMINUS
%left LT GT LE GE EQUAL NE
%left AND OR
%start STRT
%%
STRT: S END {printf("\nAccepted\n"); exit(0);}
;
S: STATEMENT S
|STATEMENT
;
STATEMENT: DATA_TYPE alpha LPAREN RPAREN LCURLY STATEMENT RCURLY
|IF LPAREN F RPAREN LCURLY STATEMENT RCURLY %prec IF
|IF LPAREN F RPAREN LCURLY STATEMENT RCURLY ELSE LCURLY STATEMENT RCURLY
|FOR LPAREN EXP SEMICOLON F SEMICOLON EXP RPAREN LCURLY STATEMENT RCURLY
|WHILE LPAREN F RPAREN LCURLY STATEMENT RCURLY
|DO LCURLY STATEMENT RCURLY WHILE LPAREN F RPAREN SEMICOLON
|DATA_TYPE declare SEMICOLON
|EXP SEMICOLON
|EXP SEMICOLON STATEMENT
;
DATA_TYPE: INT | VOID | FLOAT | CHAR | SHORT | DOUBLE
;
declare: declare COMMA declare
|alpha
|alpha ASSIGN DATA_TYPE
;
F: C LOGICAL_OP C
|C
;
C: EXP RELATION_OP EXP
|EXP
;
LOGICAL_OP: AND
|OR
;
RELATION_OP: LT|
GT|
LE|
GE|
EQUAL|
NE
;
EXP: alpha ASSIGN EXP
|EXP PLUS EXP
|EXP MINUS EXP
|EXP MULT EXP
|EXP DIVIDE EXP
|EXP XOR EXP
|LPAREN EXP RPAREN
|MINUS EXP %prec UMINUS
|alpha
|DATA_TYPE
|alpha INC
|alpha DEC
;
%%
int main(int argc,char **argv){
FILE *fp1;
fp1=fopen(argv[1],"r");
yyin=fp1;
if (yyparse()==0) printf("Parsed Successfully for string %s\n",yytext);
else printf("\nParsing Error for string %s\n",yytext);
return 0;
}
int yywrap(){
return 0;
}
void yyerror(char*s){
printf("Error: %s \n",s);
}
Syntax_analyzer.l
%{
#include "y.tab.h"
%}
digits [0-9]*
letters [a-zA-Z]
%%
"for" return FOR;
"if" return IF;
"else" return ELSE;
"while" return WHILE;
"do" return DO;
"switch" return SWITCH;
"case" return CASE;
"break" return BREAK;
"default" return DEFAULT;
"void" return VOID;
"int" return INT;
"float" return FLOAT;
"char" return CHAR;
"double" return DOUBLE;
"(" return LPAREN;
")" return RPAREN;
"{" return LCURLY;
"}" return RCURLY;
[0-9]+ return INT;
[0-9]*\.?[0-9]+|[0-9]+ return FLOAT;
("_")*{letters}("_"|{letters}|{digits})* return alpha;
[ \n\t] {;}
"+" return PLUS;
"-" return MINUS;
"/" return DIVIDE;
"*" return MULT;
"^" return XOR;
"=" return ASSIGN;
"==" return EQUAL;
"++" return INC;
"--" return DEC;
">=" return GE;
"<=" return LE;
">" return GT;
"<" return LT;
"!=" return NE;
"&&" return AND;
"||" return OR;
"$" return END;
"," return COMMA;
";" return SEMICOLON;
. return yytext[0];
%%
input.txt
void func()
{
if(a==b)
{
b=a;
}
else
{
c=a;
}
}
语法规则非常基本和简单。我不断收到错误“字符串b的解析错误”。显然我无法找出问题所在。谁能帮我吗?
编辑1:显然,涉及IF的语法规则需要花括号,而我的输入文件没有花括号。这就是语法错误的原因。更改之后,我在执行时遇到了无限循环。我不知道为什么。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)