ML-Lex是Lex的变种,是一个词法分析器的生成程序,使用ML语言。
一. ML-Lex格式
一个ML-Lex有如下格式:
user declarations %%
ML-Lex definitions %%
rules
每一部分都由%%与其他部分分隔。
rules(规则)用于定义词法分析器的功能。每个规则分为两部分:正则表达式、行为。正则表达式用于匹配单词,当匹配成功后,就执行相应的行为,所有的行为必须返回相同的类型。返回的类型在user declarations中定义。
用户可以在user declarations中定义rules中用到的值。user declarations中至少要定义两个东西:lexresult类型和eof函数。lexresult就是前面说的rules中行为的返回类型,而eof函数则在到达输入文件尾的时候被调用。通常,它将返回eof信号或者抛出异常,返回类型也是lexresult。
definitions部分中,可以定义以命名的正则表达式、开始状态等。只有当分析器在特定的起始状态时,才能与规则中的正则表达式进行匹配,用户可以在某个规则中重新定义分析器的其实状态。
ML-Lex definitions和rules两部分中的语句后面必须带有分号(;)。
二. 语法总结
1. 用户声明(user declarations)
这部分定义用户需要的类型、变量、函数,不允许使用带有%%的语句。
2. Lex声明(ML-Lex definitions)
起始状态可以这样定义:%s identifier list;
例如,定义起始状态START:%s START;
状态标识符必须以字母开头,后面可以跟字母、数字、下划线,还可以跟primes,不知道是啥……求教
命名正则表达式可以为:identifer = regular expression;
这一部分里还可以定义一些有特殊意义的函数或结构,如:
%reject可以定义REJECT()函数
3. 规则
每条规则都有相同的格式:
<
start state list>
regular expression => (
code );
start state list是可选的,用<>括起来,用,分隔,其中的每个状态必须在上文中使用%s声明过。当起始状态列表为空时,任 意起始状态都将试图与正则表达式匹配,否则,只有分析器出去列表中的状态时,才试图进行匹配。分析器从与定义的状态INITIAL开 始执行。在匹配有冲突时,分析器选择最长匹配;当有多个相同匹配时,分析器选择第一个匹配。
当输入无法匹配时,分析器将抛出名为LexError的异常。
4. 内置变量、函数
在规则的行为中,常常用到一些内置的变量或函数。
yypos:int,指示当前字符串头相对于文件开始处的位置。
yytext:string,存放最近匹配成功的字符串的值。
YYBEGIN state,转换状态,状态必须在Lex声明部分用%s声明过,默认状态为INITIAL。
(待续...)