C 为什么';这个语法不能解析return语句吗?

C 为什么';这个语法不能解析return语句吗?,c,parsing,bison,flex-lexer,yacc,C,Parsing,Bison,Flex Lexer,Yacc,我试图写一个语法,可以解析以下3个输入 -- testfile -- class hi implements ho: var x:int; end; -- testfile2 -- interface xs: myFunc(int,int):int end; -- testfile3 -- class hi implements ho: method myMethod(x:int) return y; end end; 这是lexer.l: %{ #

我试图写一个语法,可以解析以下3个输入

-- testfile --
class hi implements ho:
    var x:int;
end;

-- testfile2 --
interface xs:
  myFunc(int,int):int
end;

-- testfile3 --
class hi implements ho:
    method myMethod(x:int)
      return y;
    end
end;
这是lexer.l:

%{
#include <stdio.h>
#include <stdlib.h>
#include "parser.tab.h"
#include <string.h>

int line_number = 0;
void lexerror(char *message);
%}

newline         (\n|\r\n)
whitespace      [\t \n\r]*
digit           [0-9]
alphaChar       [a-zA-Z]
alphaNumChar    ({digit}|{alphaChar})
hexDigit        ({digit}|[A-Fa-f])
decNum          {digit}+
hexNum          {digit}{hexDigit}*H
identifier      {alphaChar}{alphaNumChar}*
number          ({hexNum}|{decNum})
comment         "/*"[.\r\n]*"*/"
anything        .
%s InComment
%option noyywrap
%%
<INITIAL>{
interface       return INTERFACE;
end             return END;
class           return CLASS;
implements      return IMPLEMENTS;
var             return VAR;
method          return METHOD;
int             return INT;
return          return RETURN;
if              return IF;
then            return THEN;
else            return ELSE;
while           return WHILE;
do              return DO;
not             return NOT;
and             return AND;
new             return NEW;
this            return THIS;
null            return _NULL;
":"             return COL;
";"             return SCOL;
"("             return BRACL;
")"             return BRACR;
"."             return DOT;
","             return COMMA;
"="             return ASSIGNMENT;
"+"             return PLUS;
"-"             return MINUS;
"*"             return ASTERISK;
"<"             return LT;


{decNum}        {
                    yylval = atoi(yytext);
                    return DEC; 
                }
{hexNum}        {
                    const int len = strlen(yytext)-1;
                    char* substr = (char*) malloc(sizeof(char) * len);
                    strncpy(substr,yytext,len);
                    yylval = (int)strtol
                            ( substr
                            , NULL
                            , 16);
                    free (substr);
                    return HEX;
                }
{identifier}    {
                    yylval= (char *) malloc(sizeof(char)*strlen(yytext));
                    strcpy(yylval, yytext);
                    return ID; 
                }
{whitespace}    {}
"/*"        BEGIN InComment;
}
{newline}       line_number++;
<InComment>{
"*/"            BEGIN INITIAL;
{anything}      {}
}
.               lexerror("Illegal input");

%%

void lexerror(char *message)
{
   fprintf(stderr,"Error: \"%s\" in line %d. = %s\n",
           message,line_number,yytext);
   exit(1);
}
前两个输入按预期识别

但是,第三个失败,错误
错误出现在:y
上,我不知道为什么

在我看来,这应该是一个
,它有一个
成员
方法
,该方法包含一个
Stat
(ement)
返回
,其中
Expr
术语是一个
ID

我试着注释并删除所有不必要的部分,但结果仍然是一样的。 我还查看了解析器,以验证标识符解析是否正确,但在我看来,它们应该正确

为什么此处无法识别
返回y
中的
y
? 我不知道语法中有什么冲突吗

(请注意,我并不希望您修改完整的语法;我只是想问一下这不起作用的原因。我确信其中还有其他错误,但我真的被困在修改这一错误上了。)

这也是我的makefile:

CC    = gcc
LEX   = flex 
YAC   = bison

scanner: parser.y lexer.l
    $(YAC) -d -Wcounterexamples parser.y
    $(LEX) lexer.l
    $(CC)  parser.tab.c parser.tab.h lex.yy.c -o parser

clean:
    rm -f *.tab.h *.tab.c *.gch *.yy.c
    rm ./parser
测试:

cat testfile3 | ./parser

首先,您的语法中有一个错误:

Stats: Stat SCOL Stat
     | Stat
     ;  
一定是

Stats: Stat SCOL Stats
     | Stat
     ;  
 
(“s”添加在第行末尾)

其次,testfile3中的定义不符合语法,必须

class hi implements ho:
    method myMethod(x:int)
      return y
    end;
end;
那么“;”呢在
返回后,y
必须移动到第一个
结束后

(和
返回x
似乎更符合逻辑,但这是另一个主题,您不检查ID的有效性)



除此之外,一个类只能有一个成员,这是非常有限/限制性的

谢谢,这现在是有意义的;
返回y
只是为了检查是否有任何标识符是可解析的;这不是一个语义上合理的例子;这确实是非常严格的,但这是一个大学项目,有非常特殊的规格,否则我会改变的。
class hi implements ho:
    method myMethod(x:int)
      return y
    end;
end;