C 为什么';这个语法不能解析return语句吗?
我试图写一个语法,可以解析以下3个输入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: %{ #
-- 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;