Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行使用lex和yacc工具开发的c文件时出错_C_Compiler Construction_Yacc_Lex - Fatal编程技术网

执行使用lex和yacc工具开发的c文件时出错

执行使用lex和yacc工具开发的c文件时出错,c,compiler-construction,yacc,lex,C,Compiler Construction,Yacc,Lex,我正在尝试使用lex和yacc设计一个迷你c编译器,所以当我使用输入c文件编译它时,它显示c文件中有语法错误,即使c文件没有任何错误 LEX文件(c.l) 输出为: 8 : syntax error " Parsing complete 那么问题是为什么这个问题会出现在代码中?对代码进行任何更改以使其正常工作。我不知道问题发生在哪里,所以我发布了整个lex和yacc代码…任何建议都会很有帮助。提前感谢。您的lex模式对于#include需要一个尾随空格,您可以这样做

我正在尝试使用lex和yacc设计一个迷你c编译器,所以当我使用输入c文件编译它时,它显示c文件中有语法错误,即使c文件没有任何错误

LEX文件(c.l)

输出为:

       8 : syntax error "
       Parsing complete

那么问题是为什么这个问题会出现在代码中?对代码进行任何更改以使其正常工作。我不知道问题发生在哪里,所以我发布了整个lex和yacc代码…任何建议都会很有帮助。提前感谢。

您的lex模式对于
#include
需要一个尾随空格,您可以这样做在您的C源文件中没有。

那么我应该在哪里修改代码,使其能够顺利运行???如果您提出建议,将对我更有帮助…感谢您修复您试图解析的C示例代码(添加缺少的空格字符)或者允许
#在您的lex模式中包含
,但不包含尾随空格。对不起,SO的目的不是引导那些毫无线索的人,而是让人们能够自助。这就是我试过的。如果您自己编写这段代码(或者至少阅读它以了解它应该如何工作),您很可能知道我在说什么。既然你没有,恐怕我得假设你只是在抄袭别人的作业,试图把它修好。我拒绝。嘿,谢谢..我听到了你说的话,我成功地修复了它…很抱歉给你造成了不一致…但是我在修复了前一个错误后遇到了另一个错误..这个错误类似于8:syntax error“Parsing error.这个错误和前一个类似吗?你确定
[\n]{line++;}
哪一行增加了空格?我肯定是这样的……你想让我重新考虑这一行吗???
     %{
      #include <stdio.h>
      #include <stdlib.h>


      extern FILE *fp;

      %}

      %token INT FLOAT CHAR DOUBLE VOID
      %token FOR WHILE 
      %token IF ELSE PRINTF 
      %token STRUCT 
      %token NUM ID
      %token INCLUDE
      %token DOT

      %right '='
      %left AND OR
      %left '<' '>' LE GE EQ NE LT GT
      %%

      start:    Function 
 | Declaration
;

    /* Declaration block */
    Declaration: Type Assignment ';' 
| Assignment ';'    
| FunctionCall ';'  
| ArrayUsage ';'    
| Type ArrayUsage ';'   
| StructStmt ';'    
| error 
;

     /* Assignment block */
     Assignment: ID '=' Assignment
| ID '=' FunctionCall
| ID '=' ArrayUsage
| ArrayUsage '=' Assignment
| ID ',' Assignment
| NUM ',' Assignment
| ID '+' Assignment
| ID '-' Assignment
| ID '*' Assignment
| ID '/' Assignment 
| NUM '+' Assignment
| NUM '-' Assignment
| NUM '*' Assignment
| NUM '/' Assignment
| '\'' Assignment '\''  
| '(' Assignment ')'
| '-' '(' Assignment ')'
| '-' NUM
| '-' ID
|   NUM
|   ID
;

    /* Function Call Block */
    FunctionCall : ID'('')'
| ID'('Assignment')'
;

     /* Array Usage */
     ArrayUsage : ID'['Assignment']'
;

    /* Function block */
    Function: Type ID '(' ArgListOpt ')' CompoundStmt 
;
    ArgListOpt: ArgList
|
;
    ArgList:  ArgList ',' Arg
| Arg
;
    Arg:    Type ID
;
    CompoundStmt:   '{' StmtList '}'
;
    StmtList:   StmtList Stmt
|
;
    Stmt:   WhileStmt
| Declaration
| ForStmt
| IfStmt
| PrintFunc
| ';'
;

    /* Type Identifier block */
    Type:   INT 
| FLOAT
| CHAR
| DOUBLE
| VOID 
;

    /* Loop Blocks */ 
    WhileStmt: WHILE '(' Expr ')' Stmt  
| WHILE '(' Expr ')' CompoundStmt 
;

    /* For Block */
   ForStmt: FOR '(' Expr ';' Expr ';' Expr ')' Stmt 
   | FOR '(' Expr ';' Expr ';' Expr ')' CompoundStmt 
   | FOR '(' Expr ')' Stmt 
   | FOR '(' Expr ')' CompoundStmt 
;

   /* IfStmt Block */
    IfStmt : IF '(' Expr ')' 
    Stmt 
;

    /* Struct Statement */
    StructStmt : STRUCT ID '{' Type Assignment '}'  
;

     /* Print Function */
     PrintFunc : PRINTF '(' Expr ')' ';'
;

    /*Expression Block*/
    Expr:   
| Expr LE Expr 
| Expr GE Expr
| Expr NE Expr
| Expr EQ Expr
| Expr GT Expr
| Expr LT Expr
| Assignment
| ArrayUsage
;
    %%

    int count=0;
    #include"lex.yy.c"
    #include<ctype.h>
    int main(int argc, char *argv[])
    { 
yyin=fopen(argv[1], "r");

     if(!yyparse())
    printf("\nParsing complete\n");
else
    printf("\nParsing failed\n");

fclose(yyin);
   return 0;
   }

   yyerror(char *s) {
printf("%d : %s %s\n", line, s, yytext );
   }
   #include <stdio.h>
   int main()
   {
   int c;
   int a=10;
   int b=10; 
   c=a+b;
   printf("the value of c is %d",c);
   return 0;
   }  
    $ lex c.l
$ yacc c.y
$ gcc y.tab.c -ll -ly 
$ ./a.out add.c
       8 : syntax error "
       Parsing complete