📜  编译器设计-正则表达式

📅  最后修改于: 2021-01-18 05:24:16             🧑  作者: Mango


词法分析器仅需要扫描和识别属于手头语言的有限一组有效字符串/ token / lexeme。它搜索语言规则定义的模式。

正则表达式具有通过为符号的有限字符串定义模式来表达有限语言的能力。正则表达式定义的语法称为正则语法。常规语法定义的语言称为常规语言

正则表达式是指定模式的重要表示法。每个模式都与一组字符串匹配,因此正则表达式用作一组字符串的名称。编程语言标记可以用常规语言描述。正则表达式的规范是递归定义的一个示例。常规语言易于理解,并且执行效率很高。

正则表达式遵循许多代数定律,可用于将正则表达式操纵为等价形式。

运作方式

语言的各种操作是:

  • L和M这两种语言的并写为

    LUM = {s | s在L或s在M}

  • L和M两种语言的串联写为

    LM = {st | s在L中,t在M中}

  • 语言L的Kleene闭包写为

    L * =语言L出现零次或多次。

记号

如果r和s是表示语言L(r)和L(s)的正则表达式,则

  • Union :(r)|(s)是一个正则表达式,表示L(r)UL(s)

  • 串联:(r)(s)是一个正则表达式,表示L(r)L(s)

  • Kleene闭包:(r)*是表示(L(r))*的正则表达式

  • (r)是表示L(r)的正则表达式

优先与关联

  • *,串联(。)和| (管道符号)保持关联
  • *具有最高优先级
  • 串联(。)具有第二高的优先级。
  • | (管道符号)的优先级最低。

以正则表达式表示语言的有效标记

如果x是一个正则表达式,则:

  • x *表示x出现零次或多次。

    即,它可以生成{e,x,xx,xxx,xxxx,…}

  • x +表示x的一个或多个出现。

    即,它可以生成{x,xx,xxx,xxxx…}或xx *

  • X?表示最多出现一次x

    即,它可以生成{x}或{e}。

  • [az]是英语的所有小写字母。

    [AZ]是英语的所有大写字母。

    [0-9]是数学中使用的所有自然数位。

使用正则表达式表示符号的出现

字母= [a – z]或[A – Z]

位数= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9或[0-9]

符号= [+ | -]

使用正则表达式表示语言标记

小数=(符号) ? (数字) +

标识符=(字母)(字母|数字)*

词法分析器剩下的唯一问题是如何验证用于指定语言关键字模式的正则表达式的有效性。公认的解决方案是使用有限自动机进行验证。