TPL文法(1):基础文法(TPL Basic Syntax)

本文详细介绍了TPL文法的基础操作,包括R1 + R2、R1 | R2等组合规则,以及ch(Char)、str(String)等基础规则。还展示了如何组合规则以匹配整数、C符号等,并提供了如integer()、c_symbol()等预定义规则的示例。此外,文章提及了一些特殊规则,如eps()和eos(),以及在HTML和C/C++文法中的应用。
摘要由CSDN通过智能技术生成

TPL文法(1):基础文法(TPL Basic Syntax)

许式伟 2008-7-3

操作符(规则组合)

R1 + R2

R1 + R2 表示顺序匹配:匹配 R1 成功后继续匹配 R2。编译原理中一般以 R1 R2 表示(很遗憾,C++没有operator空格)。这应该是使用最多的文法了。

例如:要匹配html标签开始,也就是<tag>,这样写:'<' + html_symbol() + '>'。

R1 | R2

R1 | R2 表示如果 R1 匹配不成功,则匹配 R2。两者只要一个匹配成功就表示成功。

例如:要匹配C++中的类/结构体声明,也就是:

class/struct ClassName;

我们可以这样写:

(str("class") | str("struct")) + ws() + c_symbol() + skipws() + ';'

这里,ws()表示匹配>=1个空白字符,skipws()表示匹配>=0个空白字符。class/struct关键字和类名之间空白 是必须的,所以用ws(),而类名和;之间空白不是必须的,故而用skipws()。另外,str("class") | str("struct")可以缩写为str("class", "struct"),不过这不是我们要讨论的话题。

+R

+R 表示匹配规则 R 1次以上。编译原理中习惯以 R+ 表示。

例如:要匹配一个无符号整数,我们这样写: +digit()。

当然,对于这个例子,你其实不需要用+,因为我们已经提供了 u_integer() 规则了。

!R

!R 表示匹配规则 R 1次或0次。编译原理中习惯以 R? 表示,不过C++没有operator?,很遗憾。

例如:要匹配一个带符号整数,我们这样写:!(ch('+') | ch('-')) + u_integer()。

同str一样,ch('+') | ch('-') 可缩写为 ch('+', '-')。故此本例可简写为 !ch('+', '-') + u_integer()。

当然,对于这个例子,你其实不需要用!,因为我们已经提供了 integer() 规则了。

*R

*R 表示匹配规则 R 0次以上。编译原理中习惯以 R* 表示。

R1 % R2

R1 % R2 匹配一个列表。它等价于 R1 + *(R2 + R1)。

例如:要匹配一个空格分割的浮点数列表,如“1.2 1.3 2.4 3 23.01",你只需要用 real() % ws() 即可。这里用了 ws(),这就允许中间的空白可以是一个或多个。如果只允许一个空格,那么用 real() % ' ' 即可。

~R

~R 表示匹配一个非R规则的字符。R规则要求是匹配单字符的规则。例如 ~(ch('+') | ch('-')) 表示匹配任一个非+或-的字符。

未完待续。。。

TPL的基础规则

ch(Char)

ch(Char) 规则用于匹配一个字符。例如ch('<')表示匹配单个字符'<'。当 ch(Char) 规则与其他规则连用时,可简写为 Char。

例如,我们前面介绍了匹配html标签开始,也就是<tag>,这样写:'<' + html_symbol() + '>'。其实它是 ch('<') + html_symbol() + ch('>') 的缩写。

ch(Char1, Char2), ch(Char1, Char2, Char3)

它只是 ch(Char1) | ch(Char2) 和 ch(Char1) | ch(Char2) | ch(Char3) 的简写。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值