有没有比lex/flex更好(更现代)的工具来生成C的标记器?

前端之家收集整理的这篇文章主要介绍了有没有比lex/flex更好(更现代)的工具来生成C的标记器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近添加了源文件解析到现有的工具,从复杂的命令行参数生成输出文件

命令行参数变得非常复杂,我们开始允许它们被提供为被解析的文件,就像它是一个非常大的命令行一样,但语法仍然很尴尬。所以我添加了使用更合理的语法解析源文件的能力。

我使用flex 2.5.4 for Windows来生成这个自定义文件格式的tokenizer,并且它工作。但我讨厌的代码全局变量,wierd命名约定及其生成的c代码是非常糟糕的。现有的代码生成后端被粘贴到flex的输出 – 我不使用yacc或bison。

我要跳回那个代码,我想使用一个更好/更现代的工具。有谁知道某事。

>在Windows命令提示符下运行(Visual Studio集成可以,但是我使用make文件来构建)
>生成一个适当的封装的C标记器。 (无全局变量)
>使用正则表达式来描述标记化规则(兼容lex语法a plus)
>不要强迫我使用c-runtime(或假的)进行文件读取。 (从内存解析)
>当我的规则强制令牌器返回(或自动修复)时,警告我
>给我完全控制变量和方法名称(所以我可以符合我现有的命名约定)
>允许我将多个解析器链接到一个没有名称冲突的单个.exe
>如果我想要,可以生成一个UNICODE(16位UCS-2)解析器
>不是一个集成的tokenizer解析器生成器(我想要一个lex替换,而不是一个lex yacc替换)

我可能生活在一个工具,只是生成了令牌化表,如果这是唯一可用的。

解决方法

Ragel: http://www.complang.org/ragel/它适合您的大部分要求。

>它在Windows上运行
>它不声明变量,所以你可以把它们放在一个类或一个函数内,你喜欢。
>它有很好的工具分析正则表达式,看看他们什么时候回溯。 (我不太了解这个,因为我从来没有使用Ragel中的语法来创建回溯解析器。)
>变量名不能更改。
>表名称以机器名称为前缀,它们被声明为“const static”,因此您可以在同一个文件中放置多个文件,并在单个程序中使用同一个名称(只要它们具有相同名称) re在不同的文件)。
>您可以将变量声明为任何整数类型,包括UChar(或任何您喜欢的UTF-16类型)。它不会自动处理代理对。它没有Unicode的特殊字符类(我想)。
>它只做正则表达式…没有bison / yacc功能

它产生的代码干扰程序很少。代码也非常快,并且Ragel语法比任何我所见过的更灵活和可读性。这是一个坚如磐石的软件。它可以生成表驱动的解析器或goto驱动的解析器。

猜你在找的Flex相关文章