繁体   English   中英

这种钉语法有什么问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM