LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 901|回复: 4

这是为什么阿?请大家看看阿,非常奇怪的,Lolita看看好吗?

[复制链接]
发表于 2006-3-23 10:32:00 | 显示全部楼层 |阅读模式
%{

#include<stdio.h>

%}

char [a-zA-Z]
number [0-9]

%%

{char}[{char}|{number}]* { printf("got %s\n",yytext); }
[\ \t\n]* /*ignore blanks*/{ printf("newline read\n"); }
%%
extern FILE* yyin;

int main(int argc,char* argv[])
{
        yyin = fopen(argv[1],"rt");

        yylex();

        fclose(yyin);

        return 1;
}

int yywrap()
{ return 1; }
我的OS是FC4,编译用的是 G++,但是结果和我预料的很不一样,输入文件为:
safasf
afas
safffas
afasa
AAAAAAAAAAAAA
输出却是:
got sa
got fa
got s
got f
newline read
got a
got fa
got s
newline read
got sa
got f
got f
got fa
got s
newline read
got a
got fa
got sa
newline read
got A
got A
got A
got A
got A
got A
got A
got A
got A
got A
got A
got A
got A
不是说是最长匹配吗?希望大家给我点指导
发表于 2006-3-23 12:36:36 | 显示全部楼层
{char}[{char}|{number}]* { printf("got %s\n",yytext); }
[\ \t\n]* /*ignore blanks*/{ printf("newline read\n"); }
第一个正则式有问题。 [{char}|{number}]  只表示一个字符 'a' ,为什么是'a'具体原因我也说不清,应该是 lex内部规定。错就错在不应该用[] ,而应该用() 。改成{char}({char}|{number})* 即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-23 17:42:50 | 显示全部楼层
谢谢Lolita,现在这个问题解决了,但是有些新问题啊,我的lex文件不能识别单词,独立的一个lex文件能够识别单词,但是和yacc文件合到一起就不行了。晚些时候我把代码贴上来。再次感谢  Lolita
回复 支持 反对

使用道具 举报

发表于 2006-3-23 22:56:20 | 显示全部楼层
mousse 最近很用功啊,哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-24 08:29:33 | 显示全部楼层
谢谢,我是晚辈,还请大家多指点。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表