c-Bison/Flex解析问题



我正在使用bison和flex,目前遇到了一些问题。当前读取第一个字符并将其传递给Bison,但立即抛出yyerror((。它应该打印1,因为"w"是由我的Flex规则定义的Ident。

我无法确定问题的根源。我没有使用野牛的经验。

以下是我的野牛解析规则:

%%
Prog : StmtSeq               {printf("13");};
StmtSeq : Stmt StmtSeq           {printf("12");};
StmtSeq :                        {printf("11");}; 
Stmt : Id ':' Expr       {printf("10");}; 
Expr : Expr '+' Term     {printf("9");}; 
Expr : Term                  {printf("8");}; 
Term : Term '*' Factor   {printf("7");};
Term : Factor                {printf("6");};
Factor   : '(' Expr ')'          {printf("5");}; 
Factor   : '{' Expr '}'          {printf("4");}; 
Factor   : Id                    {printf("3");}; 
Factor   : SetLit                {printf("2");};
Id       : Ident                 {printf("1");};
%%

这是我的弹性语法:

{letter} {return Ident;}
({})|({{letter}(,{letter})*}) {return SetLit;} 
( {return '(';}
) {return ')';}
* {return '*';}
+ {return '+';}
{ {return '{';}
} {return '}';}
: {return ':';}
[ ]             {return;}
t              {return;}
r              {return;}
n              {return;}
. {writeIndicator(getCurrentColumnNum()); writeMessage("Illegal Character in lex"); }

输入是一个.txt文件,其中包含:

w: {f,x,a,b,c,d,e}
x: {f,a,b,c,d,e}
y: {}
z: {x}
a: {f,x,a,b,c,d,e}
b: {}  

如果您希望lex忽略一个令牌,那么与该令牌匹配的模式应该什么都不做。return不是什么都不做;它使CCD_ 2返回。此外,它是未定义的行为,因为您没有指定值yylex应该是return。(使用-Wall进行编译可能会遇到此问题。(

因此,当扫描仪读取空间时,它会向调用方返回一些未指定的值(yyparse(。当然,这并没有像预期的那样奏效。

更改(例如(

[ ]             {return;}

[ ]             ;

或者,更好的是,用替换冗余规则序列

[[:space:]]+    ;

最新更新