如何利用正则表达式实现简易的词法分析

老明姑娘_8818

老明姑娘_8818

2026-07-11

422人浏览

原创

正则表达式是构建简易词法分析器最直接、最实用的工具,适合教学、脚本解析或轻量级语言处理;需明确词法单元类型并按优先级顺序匹配,用re.match锚定开头,关键字后处理,注意浮点数和回溯陷阱。

如何利用正则表达式实现简易的词法分析

正则表达式是构建简易词法分析器最直接、最实用的工具。它不依赖复杂框架,几条清晰的匹配规则就能覆盖标识符、数字、运算符等基本词法单元,适合教学、脚本解析或轻量级语言处理。

明确要识别的词法单元类型

先列出目标语言中需要区分的基本记号(token),每种对应一条正则规则。常见类型包括:

  • 标识符:以字母或下划线开头,后跟字母、数字或下划线,如 count、_temp1 → 正则:[a-zA-Z_][a-zA-Z0-9_]*
  • 整数:一串连续数字,如 42、0 → 正则:[0-9]+
  • 运算符:如 +、-、*、/、= → 正则:[+\-*/=](注意 - 放在字符类开头或结尾避免被误认为范围符)
  • 空白符:空格、制表符、换行 → 正则:\s+,用于跳过,不生成 token
  • 括号与分隔符:如 (、)、; → 可单独写为字面量,如 [()] 或逐个匹配

按优先级顺序逐一尝试匹配

词法分析是贪心过程:从输入字符串开头出发,用所有规则从左到右试匹配,取最长匹配且最先成功的规则(通常需按语义重要性或长度排序,比如把 == 放在 = 前面)。

Twinny
Twinny

Twinny是专为 VS Code 设计的AI代码补全插件。

下载
  • 例如,对输入 "== 42",应先尝试 ==(正则 ==),再试 =,否则会错误切分为两个单等号
  • 实际代码中,可将规则按列表存储,遍历执行 regex.match(input, pos),保留匹配长度最大的结果
  • 匹配成功后,推进读取位置(pos += matched_length),继续处理剩余部分

封装成可复用的 tokenizer 函数

核心逻辑简洁:维护当前位置、输入字符串、结果 token 列表;循环尝试匹配,跳过空白,遇到无法匹配的字符报错或跳过。

  • Python 示例片段:
    tokens = []<br>pos = 0<br>while pos   matched = False<br>  for pattern, token_type in rules:<br>    m = re.match(pattern, text[pos:])<br>    if m:<br>      value = m.group(0)<br>      if token_type != 'WHITESPACE':<br>        tokens.append({'type': token_type, 'value': value})<br>      pos += len(value)<br>      matched = True<br>      break<br>  if not matched:<br>    raise SyntaxError(f"Unexpected character at position {pos}: '{text[pos]}'")
  • 规则列表示例:
    rules = [<br>  (r'[a-zA-Z_][a-zA-Z0-9_]*', 'IDENTIFIER'),<br>  (r'[0-9]+', 'NUMBER'),<br>  (r'==|!=|=', 'OPERATOR'),<br>  (r'[+\-*/=]', 'OPERATOR'),<br>  (r'\s+', 'WHITESPACE')<br>]

注意边界与常见陷阱

看似简单,但几个细节决定是否健壮:

  • 匹配必须锚定开头:使用 re.match()(而非 re.search()),确保从当前读取位置开始匹配,避免跨词捕获
  • 关键字需后处理:先统一匹配标识符,再查表判断是否为 if、while 等保留字,避免正则穷举导致规则膨胀
  • 浮点数需更严谨:[0-9]+\.[0-9]+ 会漏掉 .5 或 3.,推荐用 (\d+\.\d*|\.\d+|\d+)([eE][+-]?\d+)?
  • 避免回溯灾难:嵌套量词如 (a+)+b 在坏输入下可能指数级慢,简易 lexer 中尽量用原子结构,不写过度通用的模式

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4876

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

3341

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9302

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

832

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

520

5

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

693

12

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

2023.11.17

406

3

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.06

739

7

php正则表达式有哪些
php正则表达式有哪些

php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、&a

2024.02.23

312

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.7万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习