Joh*_*ler 22 c++ windows lex tokenize
我最近添加了源文件解析到现有工具,该工具从复杂的命令行参数生成输出文件.
命令行参数变得如此复杂以至于我们开始允许它们作为一个被解析的文件提供,就像它是一个非常大的命令行一样,但语法仍然很尴尬.所以我添加了使用更合理的语法解析源文件的功能.
我使用flex 2.5.4 for windows为这个自定义源文件格式生成了tokenizer,并且它有效.但我讨厌代码.全局变量,奇怪的命名约定以及它生成的c ++代码非常糟糕.现有的代码生成后端粘在flex的输出上 - 我不使用yacc或bison.
我即将重新回到代码中,我想使用更好/更现代的工具.有谁知道的东西.
如果这是唯一可用的东西,我可能会使用刚生成标记化表的工具.
Die*_*Epp 11
Ragel:http://www.complang.org/ragel/它符合您的大多数要求.
它生成的代码对程序的干扰很小.代码也非常快,Ragel语法比我见过的任何东西都更灵活,更易读.它是一块坚如磐石的软件.它可以生成表驱动的解析器或goto驱动的解析器.
Boost.Spirit.Qi(解析器 - 标记化器)或Boost.Spirit.Lex(仅限标记器).我绝对喜欢Qi,Lex也不错,但我只是倾向于采取Qi来满足我的解析需求......
Qi的唯一真正缺点往往是编译时间的增加,并且它的运行速度也比手写的解析代码稍慢.但它通常比使用正则表达式解析要快得多.
http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/index.html
Flex还有一个C++输出选项.
结果是一组进行解析的类.
只需将以下内容添加到lex文件的头部:
%option C++
%option yyclass="Lexer"
Run Code Online (Sandbox Code Playgroud)
然后在你的来源中它是:
std::fstream file("config");
Lexer lexer(&file)
while(int token = lexer.yylex())
{
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4351 次 |
最近记录: |