d****g 发帖数: 1049 | 1 借你的牛刀杀只小鸡:)
我正在写一个处理格式文本的程序。想用flex,感觉是用不到yacc.
文件格式很简单,就是:
关键词:数据
但是文本里有不同数据块,比如:
类型: 联系方式
姓名:xxx
地址:xxx
类型:产品
名称: xxx
型号: xxx
类型:运动
名称:xxx
类别:xxx
我觉得用flex就足够了,因为结构比较简单。
我看了看flex的说明,有一点不知道怎么弄。
就是我拿到关键词以后怎么再拿到数据?
我应该在下面的规则里面加一个什么规则?
我现在是用".", 然后把所有不和关键字匹配
的字符全送到一个字串,可是觉得这么做很慢,
而且好像也很笨:)
%%
{keyword} {printf("%s\n", yytext);}
. {strcat(data,yytext);}
%% |
s****t 发帖数: 698 | 2
之前看过一个叫altr?的似乎是比较新的parser,
你可以找找看。
//btw:我不是大牛,只是似乎原来看过,顺便想起来了,希望能帮上你。
【在 d****g 的大作中提到】 : 借你的牛刀杀只小鸡:) : 我正在写一个处理格式文本的程序。想用flex,感觉是用不到yacc. : 文件格式很简单,就是: : 关键词:数据 : 但是文本里有不同数据块,比如: : 类型: 联系方式 : 姓名:xxx : 地址:xxx : 类型:产品 : 名称: xxx
|
w***g 发帖数: 5958 | 3 中文弄起来比较麻烦。这么简单的格式还不如用c直接写快。
【在 d****g 的大作中提到】 : 借你的牛刀杀只小鸡:) : 我正在写一个处理格式文本的程序。想用flex,感觉是用不到yacc. : 文件格式很简单,就是: : 关键词:数据 : 但是文本里有不同数据块,比如: : 类型: 联系方式 : 姓名:xxx : 地址:xxx : 类型:产品 : 名称: xxx
|
d****g 发帖数: 1049 | 4 谢谢,去找找看。
【在 s****t 的大作中提到】 : : 之前看过一个叫altr?的似乎是比较新的parser, : 你可以找找看。 : //btw:我不是大牛,只是似乎原来看过,顺便想起来了,希望能帮上你。
|
d****g 发帖数: 1049 | 5 谢谢,不过我处理的文本是英文的。写中文是为了表达清楚。
【在 w***g 的大作中提到】 : 中文弄起来比较麻烦。这么简单的格式还不如用c直接写快。
|
d*h 发帖数: 2347 | 6 不是大牛。
但这个应用也太简单了。用正则表达式就处理了,哪里用得着flex. 不知你用什么语言
,不过绝大多数语言都提供re,实在没有或者对delievered 的re不满意的话,自己写
一个状态机也就是两个loop, 1个小时的事情。
【在 d****g 的大作中提到】 : 借你的牛刀杀只小鸡:) : 我正在写一个处理格式文本的程序。想用flex,感觉是用不到yacc. : 文件格式很简单,就是: : 关键词:数据 : 但是文本里有不同数据块,比如: : 类型: 联系方式 : 姓名:xxx : 地址:xxx : 类型:产品 : 名称: xxx
|
d****g 发帖数: 1049 | 7 我贴子里没说清楚,我那文本里有近百关键字。自己写可能挺烦。
【在 d*h 的大作中提到】 : 不是大牛。 : 但这个应用也太简单了。用正则表达式就处理了,哪里用得着flex. 不知你用什么语言 : ,不过绝大多数语言都提供re,实在没有或者对delievered 的re不满意的话,自己写 : 一个状态机也就是两个loop, 1个小时的事情。
|
d****g 发帖数: 1049 | 8 嗯,懂你的意思了。
主要是程序要求用C/C++,可是已经10+年没碰了。而且印象中
C/C++不内置regular expression库。也没先去找找。
想用flex是因为它可以自动生成主干代码,可以省很多事。
昨天去查了一下发现有现成的regular expression的C++库可以用。
【在 d*h 的大作中提到】 : 不是大牛。 : 但这个应用也太简单了。用正则表达式就处理了,哪里用得着flex. 不知你用什么语言 : ,不过绝大多数语言都提供re,实在没有或者对delievered 的re不满意的话,自己写 : 一个状态机也就是两个loop, 1个小时的事情。
|
c*****t 发帖数: 1879 | 9 1. C 有 regex,C++ 有 boost 里的 regex
2. scanf 很多情况下可以代替 regex 。
3. LZ 的问题根本不需要 flex / regex 。非常基本的 text input 。
【在 d****g 的大作中提到】 : 嗯,懂你的意思了。 : 主要是程序要求用C/C++,可是已经10+年没碰了。而且印象中 : C/C++不内置regular expression库。也没先去找找。 : 想用flex是因为它可以自动生成主干代码,可以省很多事。 : 昨天去查了一下发现有现成的regular expression的C++库可以用。
|
g*****n 发帖数: 420 | 10 Antlr 可以生成C的代码,而且生成的代码比较像人写的,比较好调试。lex和yacc这种
东西生成的代码比较像天书 |
v***n 发帖数: 5085 | |
h******u 发帖数: 155 | 12 parse formated text文本为啥要用这些复杂的 parser generator呀?你说的功能
perl 下面几行就可以搞定了
@lines = `cat filename`;
$numLines = scalar(@lines);
for($p =0; $p < $numLines; $p++){
$line = $fileLines[$i];
if($line =~ /\(w+\)\:\(w+\)/){
$key = $1;
$value = $2;
}
}
$1, $2就是你要的东西 “姓名“ 和 “xxx“ |
h******u 发帖数: 155 | 13 现有的parse generator通常用来检查 context-free-language的recognition 问题。
这些language一般都有matched open parentheses的属性,例如你有左括号,需要右括
号。检查 CFL-recognition不是trivial的问题,所以需要这样的parser生成器。 或者
可以做些 attribute grammar的属性检查 (某个production被evaluate的时候有些什
么action需要产生)。 一般的formated text parsing 不要往这个上面去想。perl就
是用来干这种事情的。 |