0

这里是输入文件、.l 文件、.y 文件和输出。

问题是解析器无法递归识别方向..

它只是首先识别...

我使用相同的规则来识别端口及其工作

但不是在方向的情况下..

它也没有显示与规则关联的 .y 文件代码(cout 语句)

输入文件 。

start a b c d                //ports

a:O b:I c:B d:O    //direction of ports

.l 文件

[\t]+                   {}

[\n]  {line_num++; cout"line_num:" line_num; }

start                   {  cout< "beggining of file"; return START;}



[a-zA-Z0-9_\-]+:[IOB]    {cout<<"\ndirection:" << strdup(yytext); return DR; }

[a-zA-Z0-9_\-]+     {cout<<"\nfound name:" strdup(yytext); return NAME;}

.y 文件语法

doc : START ports dir

ports : NAME ports  { cout<<"\port in .y" $1;}

        | NAME    { cout<<"\nport in .y" $1;}
        ;


dir : DR dir       { cout<<"\ndirection in .y" $1;}

    | DR            { cout<<"\ndirection in .y"<<$1;    }
    ;

输出是。

文件开头

found name:a

found name:b

found name:c 

found name:d

 line no-2

direction:a:O
4

1 回答 1

1

你犯的唯一明显错误是你没有yylval在你的弹性动作中设置值,所以在你$1的所有野牛动作中都有一些未初始化的值。你的弹性动作应该是这样的:

[a-zA-Z0-9_\-]+     { yylval = strdup(text);
                      cout  <<  "\nfound name:" << yylval;
                      return NAME;
                    }

此外,请确保您指定令牌的类型DRNAMEconst char *.

free()最后,当您不再需要它们时,不要忘记使用琴弦。

于 2013-02-27T13:05:51.863 回答