Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有比lex/flex更好(更现代)的工具来为C+生成标记器+;?_C++_Windows_Lex_Tokenize - Fatal编程技术网

C++ 是否有比lex/flex更好(更现代)的工具来为C+生成标记器+;?

C++ 是否有比lex/flex更好(更现代)的工具来为C+生成标记器+;?,c++,windows,lex,tokenize,C++,Windows,Lex,Tokenize,我最近在一个现有工具中添加了源文件解析,该工具从复杂的命令行参数生成输出文件 命令行参数变得非常复杂,我们开始允许将其作为文件提供,并将其解析为一个非常大的命令行,但语法仍然很笨拙。因此,我添加了使用更合理语法解析源文件的功能 我使用flex 2.5.4 for windows为这个自定义源文件格式生成标记器,它成功了。但我讨厌这个密码。全局变量、WiRD命名约定和生成的C++代码非常糟糕。现有的代码生成后端被粘在flex的输出上——我不使用yacc或bison 我将回到代码中,我想使用一个更好

我最近在一个现有工具中添加了源文件解析,该工具从复杂的命令行参数生成输出文件

命令行参数变得非常复杂,我们开始允许将其作为文件提供,并将其解析为一个非常大的命令行,但语法仍然很笨拙。因此,我添加了使用更合理语法解析源文件的功能

我使用flex 2.5.4 for windows为这个自定义源文件格式生成标记器,它成功了。但我讨厌这个密码。全局变量、WiRD命名约定和生成的C++代码非常糟糕。现有的代码生成后端被粘在flex的输出上——我不使用yacc或bison

我将回到代码中,我想使用一个更好/更现代的工具。有人知道这件事吗

  • 在Windows命令提示符下运行(Visual studio集成可以,但我使用生成文件来生成)
  • 生成一个适当封装的C++令牌。(无全局变量)
  • 使用正则表达式描述标记化规则(与lex syntax a plus兼容)
  • 不会强迫我使用c运行时(或伪造)来读取文件。(从内存解析)
  • 当我的规则强制标记器回溯(或自动修复)时警告我
  • 使我能够完全控制变量和方法名(因此我可以遵守现有的命名约定)
  • 允许我在没有名称冲突的情况下将多个解析器链接到单个.exe
  • 如果需要,可以生成UNICODE(16位UCS-2)解析器
  • 不是一个集成的标记器+解析器生成器(我想要一个lex替换,而不是lex+yacc替换)

如果这是唯一可用的工具,我可能会使用一个只生成标记化表的工具

我想到了两个工具,不过你需要自己找到合适的工具,还有。在两种工具中都有语言绑定,在其中可以插入到C++运行时环境中。

Flex也有C++输出选项。 结果是一组完成该解析的类

只需将以下内容添加到lex文件的头部:

%option C++
%option yyclass="Lexer"
那么在你的来源中,它是:

std::fstream  file("config");
Lexer         lexer(&file)
while(int token = lexer.yylex())
{
}
Boost.Spirit.Qi(解析器标记器)或Boost.Spirit.Lex(仅标记器)。我绝对喜欢气,莱克斯也不错,但我只是倾向于用气来满足我的解析需求

Qi唯一真正的缺点是编译时间增加,而且它的运行速度也比手工编写的解析代码稍慢。不过,它通常比使用正则表达式进行解析快得多

我突然想起了。请注意,具有Lister-Gu生器的方法被C++内部DSL(特定于域的语言)所替代,以指定令牌。仅仅因为它是代码的一部分,而不使用外部实用程序,只需遵循一系列规则来指定语法即可。

Ragel:它符合您的大多数需求

  • 它在Windows上运行
  • 它不声明变量,因此您可以根据需要将它们放入类或函数中
  • 它有很好的工具来分析正则表达式,看看它们何时会回溯。(我对此不太了解,因为我从未在Ragel中使用过创建回溯解析器的语法。)
  • 无法更改变量名
  • 表名以机器名作为前缀,并声明为“const static”,因此可以将多个表名放在同一个文件中,并在单个程序中具有多个同名表名(只要它们位于不同的文件中)
  • 您可以将变量声明为任何整数类型,包括UChar(或您喜欢的任何UTF-16类型)。不过,它不会自动处理代理项对。它也没有Unicode的特殊字符类(我想)
  • 它只做正则表达式。。。没有野牛/yacc特征

它生成的代码对程序的干扰很小。代码速度也非常快,Ragel语法比我见过的任何东西都更灵活和可读。这是一个坚如磐石的软件。它可以生成表驱动的解析器或goto驱动的解析器。

Boost.Spirit、Boost.Proto和Boost.Xpressive不是选项吗?@Konrad:可能是,我不太熟悉。产生模板而不是C++类的东西是可以接受的。说到我去Google的地方,显然有一个使用Boost库的Flex/Byon的面向对象版本。我是一个解析器生成器,它需要安装java运行时,根据我的经验,java运行时在Windows上是不稳定且烦人的。不过GoldParser看起来很有希望-谢谢。@tommeib75:dudka.cz找到了。也许他有更好的方法将flex输出打包成干净的代码。ANTLRworks非常适合于可视化您的工作和调试,Goldparser很不错,但速度非常慢。即使在速度优化的C++代码中,解析15000行代码需要10秒。如果与PHP解析器的速度相比,这是非常慢的。是的,我尝试过这个,它甚至比C代码IMO还要差,但它确实解决了golbal变量和多实例问题。因为你没有维护生成的代码,所以它的细节是不相关的。您的源文件是lex文件。只要代码正常工作,并且不会污染全局名称空间,那么实现细节就不相关。注1:不要构建源文件,只构建目标文件和标题(即立即删除源文件)。使对象和lex文件之间的依赖关系不是源文件。注意:它们很混乱,因为为了提高效率。谢谢,我来看看Boost