是否有可能扭转语法?

时间:2015-01-13 10:30:53

标签: parsing grammar context-free-grammar

对于给定的无上下文语法,是否可以获得“反向语法”?

“反向语法”是指一种语法,它接受由原始语法语言中的反转词组成的语言。

例如语法

root = r1 [r2] *r3
r1   = "a"
r2   = "b"
r3   = "cd"

当反转时看起来像这样:

root = *r3 [r2] r1
r1   = "a"
r2   = "b"
r3   = "dc"

我问这个的原因是我想向后解析字符串(从结束到开始)。为此,我需要“反向语法”。

有没有一种系统的方法来获得“反向语法”?

将恢复每项规则的工作吗?对我来说似乎如此。但我预计,在我找不到任何东西时会在某处说出这样的“引理”。那么也许它只在简单的例子中出现过呢?

2 个答案:

答案 0 :(得分:6)

在字符串反转的操作下关闭了一组无上下文语言,这是一种数学方式,如果你有一个无上下文的语言,那么向后组成相同字符串的语言也是上下文 - 自由。证明很简单,并且恰好基于指示的转换:采用无上下文语法并反转每个右侧;结果语法显然是无上下文的,并接受原始语法接受的字符串的反向。在形式语言理论的标准教科书或互联网上可以很容易地找到形式证明。 [1]

常规语言也是如此,使用非常相似的结构。

然而,实际上,存在一个问题:虽然为语言的反向构造的语法显然没有上下文,但它可能不是LR(1)。构造一个LR(1)语法的例子很容易,反之则不然:

S -> a A
S -> b B
A -> a
A -> A a
B -> a
B -> B a

它识别反向为b?a*的常规语言a*b?,但语法以不同的方式解析a的字符串,具体取决于字符串是否开始(结束,在这种情况下)反转的)b。在这个简单的例子中,语言是规则的,因此反向语言也是规则的,因此两者都可以通过一些语法从左到右进行解析。但是,情况并非总是如此,并且无论如何您通常会解析字符串以获取解析树,而不仅仅是确定字符串是否有效。

简而言之,您可以通过反转所有右侧来构建一个无上下文语法来反转语言,但结果语法可能不那么容易解析。 (或者它可能更容易。)


注释

  1. 一个好的搜索可能是context free language closure properties

答案 1 :(得分:3)

FWIW,Grune&雅各布斯的解析技术第2版。 2008(p.68)定义了语法的逆转(将lhs转换为rhs,从终点开始并添加新的开头),自下而上和自上而下的解析和生成/缩减二元性。

然而,无法理解为什么反向字符串无法使用您描述的语法进行解析。如果你需要的是一个非反转字符串的解析结果(假设你不能按正常顺序输入字符串并且必须向后解析),你可能还需要反转解析结果,例如AST。

希望这有帮助。

P.S。 “由反向词组成的语言” - 看起来你暗示一种由反向字符串组成的语言;对于反向词,你不需要反转root的rhs。

P.P.S。语法是一个树,它是一个图形,因此您可以找到有用的树/图形反转方法。