ML-Lex笔记

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。

 

 

(待续...)

 

 

 

 


 

参考:http://www.smlnj.org/doc/ML-Lex/manual.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值