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) 的简写。