这是语法程序的重新表述吗?以前由Vag提出,并有评论者的很多建议。
可以通过哪种方式将语法视为指定计算模型?例如,如果我们采用简单的无上下文语法,例如
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
假设解析器不区分终端符号和非终端符号,如我在此处所演示的,则可以对不超过3的数字执行简单的算法。
例如,取字符串
"2 + 0 + 1"
在此字符串上运行LR(1)解析器应为我们提供以下具体的语法树,其中计算结果存储在树的根目录中:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
因此,如果我们将语法作为程序,将语法分析器生成器作为编译器,能否将语法规范语言视为一种编程语言?
此外,我们是否可以通过指定语法来构建图灵完备的程序,就像您可以使用celullar自动机或lambda演算来构建图灵完备的程序一样?
换句话说,已知在识别语言的意义上,常规语言对应于有限状态自动机,无上下文语言对应于下推自动机,而上下文相关语言对应于线性有界自动机。但是,如果我们将语法视为计算设备(即上述示例中的程序),那么如何在Chomsky层次结构中对每类语法的计算强度进行分类?
另外,诸如此类的鲜为人知的语法子类又如何呢?
编辑:顺便说一句,这是我自己的问题,但我没有提到我没有为示例语法提供任何起始符号,并且在区分终端和非终端时需要挥手挥手。从技术上或传统上,我认为语法可能必须以这种更复杂的形式编写(其中S是起始符号,$表示流末尾):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
...并不是说它确实可以改变任何东西,但我想我应该提一下。
编辑:当我阅读gasche的答案时,想到的另一件事是在我的示例中树中的每个分支都代表一个子计算。如果您将每条生产规则视为一个函数,其中LHS表示结果而RHS表示其参数,则语法的结构将决定函数的组成方式。
换句话说,解析器的上下文及其先行机制不仅有助于确定要应用的功能(如参数多态性等“ kinda”),而且还应确定如何将它们组合在一起以形成新功能。
至少,我想您可以针对明确的CFG用这种方式看待它,对于其他语法而言,精神体操现在对我来说有点过分。