【发布时间】:2018-06-21 16:58:38
【问题描述】:
我在使用保留(反斜杠)声明进行优先级消歧时遇到了问题。下面是一个独立的例子。生产“Ipv4Address”是“Domain0”的严格子集。但是,在解析 URL 时,您希望点分四组地址的处理方式与域名不同,因此您希望将“Domain0”分成两部分; 'Domain1' 是这两个部分之一。但是,包含的测试套件在 't3()' 处失败,其中 'Domain1' 接受 IP 地址,看起来应该排除它。
这是保留声明的问题,还是当前版本的 Rascal 存在缺陷?我目前在 0.10.x 不稳定分支上,根据建议查看是否解决了不同的问题(与导师)。我没有检查过 stable 分支,因为同时安装它们意味着并行 Eclipse 环境,我没有这样做的动力。
module grammar_test
import ParseTree;
syntax Domain0 = { Subdomain '.' }+;
syntax Domain1 = Domain0 \ IPv4Address ;
lexical Subdomain = [0-9A-Za-z]+ | [0-9A-Za-z]+'-'[a-zA-Z0-9\-]*[a-zA-Z0-9] ;
lexical IPv4Address = DecimalOctet '.' DecimalOctet '.' DecimalOctet '.' DecimalOctet ;
lexical DecimalOctet = [0-9] | [1-9][0-9] | '1'[0-9][0-9] | '2'[0-4][0-9] | '25'[0-5] ;
test bool t1()
{
return parseAccept(#IPv4Address, "192.168.0.1");
}
test bool t2()
{
return parseAccept(#Domain0, "192.168.0.1");
}
test bool t3()
{
return parseReject(#Domain1, "192.168.0.1");
}
bool parseAccept( type[&T<:Tree] begin, str input )
{
try
{
parse(begin, input, allowAmbiguity=false);
}
catch ParseError(loc _):
{
return false;
}
return true;
}
bool parseReject( type[&T<:Tree] begin, str input )
{
try
{
parse(begin, input, allowAmbiguity=false);
}
catch ParseError(loc _):
{
return true;
}
return false;
}
此示例已从较大的代码中删减。我第一次遇到更大范围的错误。使用规则“IPv4Address | Domain1”引发了一个歧义异常,我追查到“Domain1”接受不应该接受的东西的行为。奇怪的是,“IPv4Address > Domain1”也引发了歧义,但我猜这与目前的孤立示例具有相同的根本原因。
【问题讨论】:
标签: rascal