lex - 词法任务生成程序 ( Generates programs for lexical tasks )
用法
lex [-ct] [-n|-v] [file...]
[Compaq] 下列的语法在环境变量设为 svr4 时使用。
lex [-crt] [-n|-v] [-V] [-Qy|-Qn] [file...]
标准
本文中的接口遵循下列工业标准:
lex: XPG4, XPG4-UNIX
选项
-c 将C代码写入文件lex.yy.c 。此为缺省值。
-n 支持统计摘要。当你为有限状态机设置自己的表格尺寸时,lex将自动产生这些统计摘要,即使并没有选择此标志。
-r 将明达FORTRAN语言代码写入文件lex.yy.r 。(Tru64 UNIX没有RATFOR 编译器)
-t 输出到标准输出而不是文件。
-v 提供关于所产生的有限状态机统计的摘要。
-V [Compaq] 将lex 版本号输出到标准错误输出。要求环境变量CMD_ENV 设为svr4
-Q[y|n]
[Compaq] 决定是否将lex 版本号写入输出文件。缺省为 -Qn,表示不写入。要求环境变量CMD_ENV 设为svr4
说明
lex命令利用文件中包含的规则和动作来产生一个程序文件:lex.yy.c ,该文件可由cc命令编译。
这个程序能够接受输入信息,并根据文件中定义的规则将其分解为逻辑片段,以及执行文件所包含
动作中的程序片段。
生成程序是一个名为yylex()的C语言函数。lex 命令将该函数置于lex.yy.c文件中。你可以单独
使用yylex()函数来接受简单的,一个词的输入,或者将其与其它C语言程序联合使用以执行更为
复杂的输入信息的分析功能。例如,你可以利用lex来产生一个程序,该程序在将输入流送给由
yacc命令生成的分析程序前作上标记,
yylex()函数利用有限状态机结构对输入流进行分析。该结构只允许程序在某一时刻存在一种状态,
且状态的数量是有限的。文件中的规则定义程序如何根据接受的输入信息从一种状态转移到另一种
状态。
lex命令从文件/usr/ccs/lib/ncpform或/usr/ccs/lib/ncform中读取有限状态机结构信息。可以使
用环境变量LEXER来指定其它位置。
如果没有指定文件,lex将读取标准输入。它将多个文件当作一个文件处理。
输入文件格式
输入文件可以包含三个区域:定义区域,规则区域和用户子程序区域。各区域之间被只由%%组成的行分割,如:
definitions
%%
rules
%%
user_subroutines
定义区域
如果要在规则中使用变量,你必须在定义区域中定义它们。变量在左边,定义体在右边,例如,定义D为数字:
D [0-9]
你可以在规则区域中使用定义的变量,使用时将它们用{}括上,如{D}。
在定义区域内,你可以设置下列两个互斥的声明。
%array
声明yytext类型为以空字符结尾的数组。
%pointer
声明yytext类型为以空字符结尾的字符串指针。此定义选择 /usr/ccs/lib/ncpform 框架
在定义区域中,你也可以设置有限状态机的表格尺寸。缺省的尺寸对于小程序而言足够大,
你或许想为更为复杂的程序设置更大的尺寸:
%p number
位置数(default 5000)
%n number
状态数(default 2500)
%e number
分析树节点数(default 2000)
%a number
转变数(default 5000)
%k number
包装的字符类数(default 2000)
%o number
输出槽数(default 5000)
如果扩展的字符出现在正则表达式字符串中,你可能需要利用 %o 参数重设输出数组的
尺寸。(可能的尺寸为10000 - 20000)。此重设反映了相对于ASCII字符集更为巨大的扩展字符集。
规则区域
规则区域是必须的。它必须由 %% 前导,即使没有定义项。命令不认识没有定界符的规则。
在规则区域中,左侧是由yylex()函数的输入文件所承认的模式。右侧是当模式被识别时
所要执行的C语言程序片段。
模式可以包含扩展字符,除了一个例外:扩展字符不能出现在由括号包含的字符类表达式内。
列与列之间由 tab键分割。例如,寻找文件中的词LEAD,将它用词GOLD替换,执行以下的步骤:
1. 创建名为transmute.l的文件,它包含以下行:
%%
(LEAD) printf("GOLD");
2. 然后在shell下执行下列命令:
lex transmute.l
cc -o transmute lex.yy.c -ll
3. 你可以使用如下命令进行测试:
transmute <transmute.l
这个命令显示文件transmute.l的内容,词LEAD被GOLD替换。
每个模式可以具有相应的动作,也就是当模式匹配时所要执行的C语言代码片段。每条语句
必须由‘;’结尾,如果一个动作有多条语句,则应该用{}括起。如果有用户子程序区域,则
规则区域之后需要分割符 %%。
