以下用于设计解析器的代码中的错误在哪里?

问题描述

我正在为解析器(语法分析器)编写代码。我收到错误消息,但我不知道是什么原因引起的。

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 (将#修改为@)