fbpx
维基百科

Quex

Quex 是一个词法分析器的产生器,它能创建C或者C++语言的词法分析器。Quex的一个显著特征是它能支持基于Unicode字符串的输入,而且创建的分析器代码是直接编码格式的(而非查表格式),具有较高的分词速度。另外,Quex在描述词法分析的语法上采用了类似于C++的继承语法和分模块语法,这使得语法的复用非常简单,语法结构更为清晰。

quex
開發者Dr.-Ing. Frank-Rene Schäfer
操作系统Cross-platform
类型Lexical analyzer generator
许可协议LGPL
网站quex.sourceforge.net

特性 编辑

直接编码词法分析器 编辑

Quex使用传统的汤普森创造法,从从正则表达式首先创建不确定性有限状态机,然后通过压缩和归并转换为确定性有限状态机,通过Hopcroft优化算法,使得确定性有限状态机的状态个数达到最小。通过这些机制,使得构建词法分析器的计算时间可以大大减少。相比其他词法分析器生成器只能处理[ASCII]字符串的情况,Quex还可以支持Unicode字符集,并可以产生合理的运算时间的词法分析器。 相比基于查表结构的词法分析器,Quex产生的直接编码方式的代码具有更高的运算速度,而且直接编码方式的代码更接近于人类手工书写的词法分析器代码,因此比查表结构的代码具有良好的可读性。

支持Unicode字符输入 编辑

Quex可以处理包含完整的Unicode代码点范围(0至10FFFFh)的字符输入,同时Quex的词法语法提供了支持Unicode的正则表达式格式。例如,与二进制属性XID_Start的Unicode代码点可以用表达式指定的\P{XID_Start}\P{XIDS}来描述。Quex还可以生成代码来调用iconv库或ICU的字符格式转换程序。Quex遵循Unicode Consortium提出的Unicode标准,若Unicode标准更新,则只需要将新版本的标准文件复制到到Quex相应的目录即可完成Quex对Unicode的支持更新。

词法分析模式 编辑

和传统的词法分析器(如LEX和Flex),Quex支持词法分析器中存在多个词法分析子模块(子模式)。除了传统的正则表达式的模式匹配外,Quex还可以指定事件动作:例如代码执行期间进入或退出一个模块或发现任何模式匹配时。Quex这种模块设计可以通过继承方式,让派生和继承模块很容易共享基类模块的匹配模式和事件操作。

先进的缓冲处理 编辑

Quex提供了先进的数据缓冲和重新装载,保证了运行时的高效和灵活。Quex以插件的方式提供字符转换的用户接口,允许用户使用自定义的字符集转换程序。当需要新的缓冲区填充的时候,转换程序被激活。默认情况下Quex使用的是iconv字符转换库,能够提供多种字符编码集之间的转换。

范例 编辑

can be translated into Quex source code as follows: 

Quex使用的字符串匹配语法和经典lex和FLEX的词法生成器工具采用的正则表达式语法类似。Flex中的例子程序可以很容易的转换为Quex的语法。

header {  #include <cstdlib> // C++ version of 'stdlib.h' } define {  digit [0-9]  letter [a-zA-Z] } mode X : <skip: [ \t\n\r]>  {  "+"  => QUEX_TKN_PLUS;   "-"  => QUEX_TKN_MINUS;   "*"  => QUEX_TKN_TIMES;   "/"  => QUEX_TKN_SLASH;   "("  => QUEX_TKN_LPAREN;   ")"  => QUEX_TKN_RPAREN;   ";"  => QUEX_TKN_SEMICOLON;   ","  => QUEX_TKN_COMMA;   "."  => QUEX_TKN_PERIOD;   ":="  => QUEX_TKN_BECOMES;   "="  => QUEX_TKN_EQL;   "<>"  => QUEX_TKN_NEQ;   "<"  => QUEX_TKN_LSS;   ">"  => QUEX_TKN_GTR;   "<="  => QUEX_TKN_LEQ;   ">="  => QUEX_TKN_GEQ;   "begin"  => QUEX_TKN_BEGINSYM;   "call"  => QUEX_TKN_CALLSYM;   "const"  => QUEX_TKN_CONSTSYM;   "do"  => QUEX_TKN_DOSYM;   "end"  => QUEX_TKN_ENDSYM;   "if"  => QUEX_TKN_IFSYM;   "odd"  => QUEX_TKN_ODDSYM;   "procedure" => QUEX_TKN_PROCSYM;   "then"  => QUEX_TKN_THENSYM;   "var"  => QUEX_TKN_VARSYM;   "while"  => QUEX_TKN_WHILESYM;   {letter}({letter}|{digit})* => QUEX_TKN_IDENT(strdup(Lexeme));  {digit}+  => QUEX_TKN_NUMBER(atoi(Lexeme));  .   => QUEX_TKN_UNKNOWN(Lexeme); } 

通过使用符号“=>”操作符,可以将特定的匹配字符串和对应的词法的Token的ID进行关联。尖括号中的语法表示词法分析器将跳过由空格和tab等组成的字符,圆括号内表示字符串匹配后,可调用C函数进行相应的处理。

对于更复杂的处理,可使用花括号包含所需要的处理语句,如下所示:

 ...  {digit}+ {   if( is_prime_number(Lexeme) ) ++prime_number_counter;   if( is_fibonacci_number(Lexeme) ) ++fibonacci_number_counter;    self.send(QUEX_TKN_NUMBER(atoi(Lexeme)));  }  ... 

以上的代码,可以被用来统计处理字符串中的数值的个数。

另外可查阅 编辑

  • Lexical analysis
  • 关于托马斯构建法和Hopcroft优化方法,可查阅书籍例如 Compilers: Principles, Techniques, and Tools.

外部链接 编辑

quex, 是一个词法分析器的产生器, 它能创建c或者c, 语言的词法分析器, 的一个显著特征是它能支持基于unicode字符串的输入, 而且创建的分析器代码是直接编码格式的, 而非查表格式, 具有较高的分词速度, 另外, 在描述词法分析的语法上采用了类似于c, 的继承语法和分模块语法, 这使得语法的复用非常简单, 语法结构更为清晰, quex開發者dr, frank, rene, schäfer操作系统cross, platform类型lexical, analyzer, generator许可协议lgpl网站q. Quex 是一个词法分析器的产生器 它能创建C或者C 语言的词法分析器 Quex的一个显著特征是它能支持基于Unicode字符串的输入 而且创建的分析器代码是直接编码格式的 而非查表格式 具有较高的分词速度 另外 Quex在描述词法分析的语法上采用了类似于C 的继承语法和分模块语法 这使得语法的复用非常简单 语法结构更为清晰 quex開發者Dr Ing Frank Rene Schafer操作系统Cross platform类型Lexical analyzer generator许可协议LGPL网站quex sourceforge net 目录 1 特性 1 1 直接编码词法分析器 1 2 支持Unicode字符输入 1 3 词法分析模式 1 4 先进的缓冲处理 2 范例 3 另外可查阅 4 外部链接特性 编辑直接编码词法分析器 编辑 Quex使用传统的汤普森创造法 从从正则表达式首先创建不确定性有限状态机 然后通过压缩和归并转换为确定性有限状态机 通过Hopcroft优化算法 使得确定性有限状态机的状态个数达到最小 通过这些机制 使得构建词法分析器的计算时间可以大大减少 相比其他词法分析器生成器只能处理 ASCII 字符串的情况 Quex还可以支持Unicode字符集 并可以产生合理的运算时间的词法分析器 相比基于查表结构的词法分析器 Quex产生的直接编码方式的代码具有更高的运算速度 而且直接编码方式的代码更接近于人类手工书写的词法分析器代码 因此比查表结构的代码具有良好的可读性 支持Unicode字符输入 编辑 Quex可以处理包含完整的Unicode代码点范围 0至10FFFFh 的字符输入 同时Quex的词法语法提供了支持Unicode的正则表达式格式 例如 与二进制属性XID Start的Unicode代码点可以用表达式指定的 P XID Start 或 P XIDS 来描述 Quex还可以生成代码来调用iconv库或ICU的字符格式转换程序 Quex遵循Unicode Consortium提出的Unicode标准 若Unicode标准更新 则只需要将新版本的标准文件复制到到Quex相应的目录即可完成Quex对Unicode的支持更新 词法分析模式 编辑 和传统的词法分析器 如LEX和Flex Quex支持词法分析器中存在多个词法分析子模块 子模式 除了传统的正则表达式的模式匹配外 Quex还可以指定事件动作 例如代码执行期间进入或退出一个模块或发现任何模式匹配时 Quex这种模块设计可以通过继承方式 让派生和继承模块很容易共享基类模块的匹配模式和事件操作 先进的缓冲处理 编辑 Quex提供了先进的数据缓冲和重新装载 保证了运行时的高效和灵活 Quex以插件的方式提供字符转换的用户接口 允许用户使用自定义的字符集转换程序 当需要新的缓冲区填充的时候 转换程序被激活 默认情况下Quex使用的是iconv字符转换库 能够提供多种字符编码集之间的转换 范例 编辑can be translated into Quex source code as follows Quex使用的字符串匹配语法和经典lex和FLEX的词法生成器工具采用的正则表达式语法类似 Flex中的例子程序可以很容易的转换为Quex的语法 header include lt cstdlib gt C version of stdlib h define digit 0 9 letter a zA Z mode X lt skip t n r gt gt QUEX TKN PLUS gt QUEX TKN MINUS gt QUEX TKN TIMES gt QUEX TKN SLASH gt QUEX TKN LPAREN gt QUEX TKN RPAREN gt QUEX TKN SEMICOLON gt QUEX TKN COMMA gt QUEX TKN PERIOD gt QUEX TKN BECOMES gt QUEX TKN EQL lt gt gt QUEX TKN NEQ lt gt QUEX TKN LSS gt gt QUEX TKN GTR lt gt QUEX TKN LEQ gt gt QUEX TKN GEQ begin gt QUEX TKN BEGINSYM call gt QUEX TKN CALLSYM const gt QUEX TKN CONSTSYM do gt QUEX TKN DOSYM end gt QUEX TKN ENDSYM if gt QUEX TKN IFSYM odd gt QUEX TKN ODDSYM procedure gt QUEX TKN PROCSYM then gt QUEX TKN THENSYM var gt QUEX TKN VARSYM while gt QUEX TKN WHILESYM letter letter digit gt QUEX TKN IDENT strdup Lexeme digit gt QUEX TKN NUMBER atoi Lexeme gt QUEX TKN UNKNOWN Lexeme 通过使用符号 gt 操作符 可以将特定的匹配字符串和对应的词法的Token的ID进行关联 尖括号中的语法表示词法分析器将跳过由空格和tab等组成的字符 圆括号内表示字符串匹配后 可调用C函数进行相应的处理 对于更复杂的处理 可使用花括号包含所需要的处理语句 如下所示 digit if is prime number Lexeme prime number counter if is fibonacci number Lexeme fibonacci number counter self send QUEX TKN NUMBER atoi Lexeme 以上的代码 可以被用来统计处理字符串中的数值的个数 另外可查阅 编辑Lexical analysis 关于托马斯构建法和Hopcroft优化方法 可查阅书籍例如 Compilers Principles Techniques and Tools 外部链接 编辑Quex 页面存档备份 存于互联网档案馆 官方网页 SourceForge net上的Lexical Analyzer Generator Quex sourceforge 主页 取自 https zh wikipedia org w index php title Quex amp oldid 64190094, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。