我最近添加了源文件解析到现有工具,该工具从复杂的命令行参数生成输出文件。
命令行参数变得非常复杂,我们开始允许它们作为一个被解析的文件提供,就好像它是一个非常大的命令行,但语法仍然很尴尬。所以我添加了使用更合理的语法解析源文件的功能。
我使用flex 2.5.4 for windows为这个自定义源文件格式生成标记器,并且它有效。但我讨厌代码。全局变量,奇怪的命名约定以及它生成的c ++代码非常糟糕。现有的代码生成后端粘在flex的输出上 - 我不使用yacc或bison。
我即将重新回到那段代码中,我想使用更好/更现代的工具。有谁知道这件事。
如果这是唯一可用的东西,我可能会使用刚生成标记化表的工具。
答案 0 :(得分:11)
Ragel:http://www.complang.org/ragel/它符合您的大多数要求。
它生成的代码对程序的影响非常小。代码也非常快,Ragel语法比我见过的任何东西都更灵活,更易读。它是一块坚如磐石的软件。它可以生成表驱动的解析器或goto驱动的解析器。
答案 1 :(得分:6)
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
答案 2 :(得分:5)
我想到了两种工具,但您需要自己找出合适的工具,Antlr和GoldParser。两种工具都提供了语言绑定,可以将其插入到C ++运行时环境中。
答案 3 :(得分:5)
Flex还有一个C ++输出选项 结果是一组用于解析的类。
只需将以下内容添加到lex文件的头部:
%option C++
%option yyclass="Lexer"
然后在你的来源中它是:
std::fstream file("config");
Lexer lexer(&file)
while(int token = lexer.yylex())
{
}
答案 4 :(得分:2)