[英]what is wrong with this peg grammar?
以下语法(来自RFC 2396):
domainlabel = 'a' / ('a' ('a' / '-')* 'a')
无法解析此:
aa
为什么?
因为PEG不是BNF。 使用/而不是通常的BNF交替运算符| (如RFC 2396所示)是为了避免混淆而进行的有意尝试(尽管RFC 822等较旧的标准也使用/并没有帮助)。
在PEG中, /是“ 有序选择”运算符 。 与BNF交替运算符不同, /不对称。 如果第一种选择成功,则将被接受。 仅当第一种方法失败时,PEG才会回溯并尝试第二种方法。
因此,当将'a' / ('a' ('a' / '-')* 'a')
应用于aa
,第一个选择成功吸收了第一个a ,而从未尝试过第二个选择。 解析随后无法匹配整个字符串的事实无关紧要; /仅当匹配第一个替代项本身失败时才回溯,而不是如果解析的某些后续部分失败时则回溯。
简而言之,如果您使用PEG,则需要注意以正确的顺序书写替换内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.