【问题标题】:Rascal: parsing string with multiple "_"sRascal:用多个“_”解析字符串
【发布时间】:2019-10-27 22:05:01
【问题描述】:

我尝试解析包含多个“_”的字符串,但出现 CallFailed 异常。

我尝试创建一个尽可能小的问题语法示例。

layout Layout = WhitespaceAndComment* !>> [\ \t\n\r#];
lexical WhitespaceAndComment = [\ \t\n\r] | @category="Comment" "#" ![\n]* $;

syntax SourceList = sourceList: "$"? "{"? Id sourceFile "}"?;
lexical Id = ([a-zA-Z/.\-][a-zA-Z0-9_/.]* !>> [a-zA-Z0-9_/.]) \ Reserved;
keyword Reserved = 
"$" | "{" | "}" ; 

我无法解析这个小例子。

rascal>try { parse(#SourceList, "test"); } catch CallFailed(m, e): println("<m> : <e>");
|prompt:///|(25,9,<1,25>,<1,34>) : [type(sort("SourceList"),(sort("SourceList"):choice(sort("SourceList"),{prod(label("sourceList",sort("SourceList")),[opt(lit("$")),layouts("$default$"),opt(lit("{")),layouts("$default$"),label("sourceFile",lex("Id")),layouts("$default$"),opt(lit("}"))],{})}),layouts("$default$"):choice(layouts("$default$"),{prod(layouts("$default$"),[],{})}),empty():choice(empty(),{prod(empty(),[],{})}),lex("Id"):choice(lex("Id"),{prod(lex("Id"),[conditional(seq([\char-class([range(45,47),range(65,90),range(97,122)]),conditional(\iter-star(\char-class([range(46,57),range(65,90),range(95,95),range(97,122)])),{\not-follow(\char-class([range(46,57),range(65,90),range(95,95),range(97,122)]))})]),{delete(keywords("Reserved"))})],{})}),keywords("Reserved"):choice(keywords("Reserved"),{prod(keywords("Reserved"),[lit("$")],{}),prod(keywords("Reserved"),[lit("}")],{}),prod(keywords("Reserved"),[lit("{")],{})}))),"${test}"]
ok

从“test”更改为“${test}”的源文件给出完全相同的输出。

嵌入 SourceList 的完整语法有更多规则。但后来我得到以下结果。

set(${TARGET_NAME}_DEPS
    GenConfiguration_OBJ_TN_Common # accept
    ${COMMON_BB_PCMDEPS}  # reject
    COMMON_BB_PCMDEPS # accept
    COMMON_BB_PCM_DEPS # reject
)

我想要一个解决方案。

最小的例子有什么问题?为什么不接受 test 或 ${test}?

顺便说一句:我正在使用最新的不稳定。安装和试用稳定版有意义吗?

【问题讨论】:

    标签: parsing syntax-error dsl rascal


    【解决方案1】:

    我试图重现您的问题,但它似乎在这里工作:

    rascal>parse(#SourceList, "test")
    SourceList: (SourceList) `test`
    

    目前不稳定的版本还可以。事实上,现在是发布稳定版本的时候了。所以现在你最好使用不稳定的版本。

    CallFailed 异常令人困惑。这意味着调用了一个无法匹配或找不到的函数。因此,通过不导入 ParseTree,可能 parse 不在范围内,或者您有一个名为 parse 的不同函数,它没有 type[Tree] 和 str 作为范围内的预期参数。只要导入 ParseTree 模块,调用parse 就可以了。

    如果您取得了进展,请告诉我。也许重新启动 Eclipse 也可能会清除一些东西。

    【讨论】:

    • 可能@Matty 定义了自己的解析函数,忘记导入解析树?
    • 这个异常让我走错了路。我确实有其他重载的解析方法处于活动状态。重新启动并手动加载 ParseTree 后,它起作用了。
    • 我也解决了原来的“_”问题。我错误地将 COMMON_BB_PCM_DEPS 放在了关键字集中。删除 COMMON_BB_PCM_DEPS 后,它会解析实例。
    • 好的,很好。我们必须认真思考如何更好地报告失败的功能。如果保证在编译时没有函数匹配,静态检查器肯定会有所帮助,但动态情况肯定需要更好的解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多