zhaoyg 发表于 2008-7-17 17:34

想用lex做一个代码注释清楚的小东西,但遇见了一个问题

%{
void comment();
%}

%%
"/*"   {comment();}
.|\n  {printf("%c",*yytext);}
%%
int main()
{
yylex();
return 0;
}
void comment()
{
int ch , prev=0;
  
while ( (ch = input()) != -1 )
{
  if (prev == "*" && ch == "/")
   return ;
  prev = ch;
}
return ;
}
int yywrap()
{
        return 1;
}

以上是我的代码,现在的问题是,对于这样的代码:
int i=0;
/*test*/
printf("test");
他会将注释连同之后的所有代码都消去。请问这是为何

VxWorks 发表于 2008-7-17 18:05

I 服了you
if (prev == "*" && ch == "/")

拿int同char*比较

zhaoyg 发表于 2008-7-17 18:08

弱弱的问一下,难道不能依赖隐式转换吗

zhaoyg 发表于 2008-7-17 18:08

我没有用int根指针比较呀
难道input返回的不是int?

VxWorks 发表于 2008-7-17 18:11

"*"的值是保存字符*的地址,你拿prev和地址比较怎么可能相等,要比较的是字符'*'不是存放'*'的地址。

真是让人郁闷,不知fish下个版本还要等多久才能出来。

zhaoyg 发表于 2008-7-17 18:16

啊啊!!!!!!
手误!!!
真的是手误!!!

应该是'*' ,我代码写错了。

VxWorks 发表于 2008-7-17 18:19

这个bug改完后试试下面的测试用例:
[quote]
int i=0;
/*test
[/quote]

zhaoyg 发表于 2008-7-17 18:20

这个好像不是正常的源码吧!

VxWorks 发表于 2008-7-17 18:25

难道用户只能用你的软件跑完美的代码吗?

软件应该足够的健壮,考虑各种可能遇到的情况

zhaoyg 发表于 2008-7-17 18:26

对了,我想在问一个问题,
就是,为什么写完.lex见后每次调用flex来生成源码时都显示说.lex文件末尾没有EOF
请问这是为何?

VxWorks 发表于 2008-7-17 18:32

没有遇到过这种情况,把flex输出信息给我看看

很多语言都要求代码文件以换行符号结束,你看看flex要的是换行还是EOF
另外你使用flex的系统应该和你建立.lex文件的一致,windos和linux对换行以及文件结尾的表示也不一样。

zhaoyg 发表于 2008-7-17 18:36

[quote][bo][un]VxWorks[/un] 在 2008-7-17 18:25 的发言:[/bo]

难道用户只能用你的软件跑完美的代码吗?

软件应该足够的健壮,考虑各种可能遇到的情况 [/quote]

如果按照你给的代码来测试,那么从/*到EOF之间的所有字符都会被忽视掉,即清理,因为我是用EOF来做循环条件的。

当然,健壮是必须的,但我个人觉得有些时候,使用者还是要自己担负其一些责任(就如同,不能printf(NULL)一样)

zhaoyg 发表于 2008-7-17 18:43

[quote][bo][un]VxWorks[/un] 在 2008-7-17 18:32 的发言:[/bo]

没有遇到过这种情况,把flex输出信息给我看看

很多语言都要求代码文件以换行符号结束,你看看flex要的是换行还是EOF
另外你使用flex的系统应该和你建立.lex文件的一致,windos和linux对换行以及文件结尾的表示也 ... [/quote]
抱歉,我现在网吧,所以具体信息我没发给你。
我只能描述一下,
错误是指向.lex文件的作后一行,然后又跟了一个我不会写的单词(其字面我记得意思是“未成熟的” ),最后是 EOF。

水中无月 发表于 2008-7-17 18:45

LZ是想做一个代码着色器?

zhaoyg 发表于 2008-7-17 18:46

着色器我前一阵子已经做了一个非常简易的了

水中无月 发表于 2008-7-17 18:51

那怎么还在处理注释的问题?着色器不是都要考虑到注释吗?
建议你去看看ISO C++标准,这对你做此程序有帮助。
在标准中说注释的内容都要用一个空格“ ”来替换的,还有可支持注释换行的匹配“\”
这些还请你自己去看看

zhaoyg 发表于 2008-7-17 18:57

谢谢你的建议。
我只是想用LEX来重新写一个以前做过的程序,
由于牵扯到注释,so....

页: [1]

编程论坛