【问题标题】:Why are redundant parenthesis not allowed in syntax definitions?为什么语法定义中不允许有多余的括号?
【发布时间】:2015-01-28 16:10:21
【问题描述】:

这个语法模块在语法上是有效的:

module mod1

syntax Empty =

;

这个也是,应该是和上一个等价的语法:

module mod2 

syntax Empty =
   ( ) 
;

(生成的解析器只接受空字符串。)

这意味着你可以制作这样的语法:

module mod3 

syntax EmptyOrKitchen =
   ( ) | "kitchen"
;

但是,以下是不允许的(嵌套括号):

module mod4 

syntax Empty =
   (( )) 
;

我猜想多余的括号是允许的,因为它们在诸如表达式之类的东西中是允许的,例如((2)) + 2.


在处理流氓语法定义的内部表示的数据类型时出现了这个问题。以下代码将创建与上一个示例相同的模块,即mod4(以一些空格为模):

import Grammar;
import lang::rascal::format::Grammar;
str sm1 = definition2rascal(\definition("unknown_main",("the-module":\module("unknown",{},{},grammar({sort("Empty")},(sort("Empty"):prod(sort("Empty"),[
                                  alt({seq([])})
                                                ],{})))))));

数据的有问题的部分在它自己的行上 - alt({seq([])})。如果将此代码更改为seq([]),那么您将获得与mod2 相同的语法模块。如果你进一步删除这整个表达式,即这样你得到这个:

str sm3 = 
definition2rascal(\definition("unknown_main",("the-module":\module("unknown",{},{},grammar({sort("Empty")},(sort("Empty"):prod(sort("Empty"),[

                                   ], {})))))));

然后你会得到mod1

那么definition2rascal(...) 函数应该打印出这样的多余括号吗?使生成的模块有效与否是否重要?

【问题讨论】:

    标签: rascal


    【解决方案1】:

    为什么不允许他们基本上是我们想看看我们是否可以不这样做。目前符号种类之间没有优先级关系,因此通常不需要括号语法(就像表达式中确实需要 + 和 * 一样)。

    括号已经有两种不同的语义,一个()epsilon符号,两个(Sym1 Sym2 ...)是一个嵌套序列。这个嵌套序列被定义(在语法上)期望至少两个符号。现在我们可以毫不含糊地为带有单个符号的括号引入第三种语义或放宽对序列的要求......但我们认为在一种情况下您会在生成的解析树(序列)中获得额外的层会令人困惑,而在另一种情况下则不会(忽略多余的括号)。

    更详细地说,打印seq([]) 的问题与其说是元语法的问题,不如说是支持抽象符号比具体符号更宽松(即它是一种更大的语言或过度近似)。解析器生成器将为seq([]) 生成一个工作解析器。但是,空序列没有流氓符号,我猜漂亮的打印机应该抛出异常。

    【讨论】:

    • 我很想听听您对此的看法。如果您愿意,我们可以在 github 的问题跟踪器上讨论它。恕我直言,这不是 stackoverflow 讨论。
    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多