是否可以设计一种没有语法错误的语言?[关闭]


14

换句话说,一种语言,其中每个可能的字符串都是有效的语法?

编辑:这是一个理论问题。
我对使用这种语言没有兴趣;我只是问是否有可能。

进一步编辑

我继续设计一种这样的语言。看到ErrorFree


2
如果我们能够做到这一点,就可以创建AI。
Michael K

5
@迈克尔:不;我不这么认为。
SLaks 2011年

7
!!! 佩尔

8
我强烈反对关闭这个问题!它既不是主观的也不是建设性的!
菲利克斯·唐贝克

1
为什么不采用以下汇编语言:大约256条指令,128个寄存器以及的通用语法instruction operand*,其中操作数可以是寄存器或0-127之间的数字(以及上面的所有内容都被视为寄存器),并且如果操作数对于多辅助指令缺少,则假定为“ 0”。
Felix Dombek

Answers:


8

是的,如果您以一种极具讽刺意味的方式研究此问题,并创建了一个确定性图灵机,该机器始终以某种特定语言的每个字符串停留在良好的最终状态,那么您将可以做到这一点。演示非常简单,您必须具有一个带有过渡功能且只有一个过渡的常规TM,如下所示:

TF(w,q) -> (w,Qa) 

Considerations:
    L = { w | w is any possible string }
    w e L
    q e Q
    F is a set with all good final states {Qa,Qr}
    Qa e F

据推测,TM具有与任何一台现实生活中的计算机相同的计算能力,因此这是绝对可能的


1
这对我们普通的外行人到底意味着什么?什么是“ w”,“ e”,“ L”,“ q”,“ Q”,“ Qa”,“ Qr”,“ F”,“ TF”。没有这些定义,我就没有参考框架。
Berin Loritsch 2011年

1
抱歉,没有简单的方法来解释图灵机解决方案。检查此链接以澄清一下:en.wikipedia.org/wiki/Turing_machine
guiman 2011年

16

是的,当然有可能,这甚至很简单。

<programm> ::= char | char <program> |

我不明白谁能说“不”。也就是说,为这种语言定义有意义的语义可能相当困难,但这也是可能的。只要看看空白


因此,如果该语言忽略它,那么它是有效的系统税吗?并且“ tabtabspace”不是有效的字符串吗?
Michael K'1

1
语言的语义是我所关心的问题,但是如果不将其置于哲学/语言学的适当范围之外,就无法真正讨论它。
StuperUser 2011年

2
迈克尔:没错。一切在语法上都是有效的,但也可能是NOP(没有特殊含义)。忽略很多东西的语言没有错。只需看一下C在此示例程序中忽略的所有内容即可:int main(){3 ;;; / *评论* /}
2011年

许多人之所以说“不”是因为他们在语法和语义之间没有概念上的区别。“它不能编译?那么必须是语法错误!”
fredoverflow 2011年

许多人说“不”,因为这没有真正的意义。一旦添加了结构(即,不仅仅是一个自递归解析规则),便有了语法的概念。违反结构是语法引起的错误。语法引起的错误是语法错误,无论解析器是否将其标记为此类。
Berin Loritsch 2011年

5

我猜这取决于有效语法的含义。

您可以设计一种语言,该语言可以接受任何字符串,但可以忽略任何未指定特定含义的内容。基本上,这相当于说“我将摆脱语法错误,但说它们不是错误” –毫无意义,出于多种原因,这是非常不希望的。

除此之外,拥有一种没有语法错误的语言的唯一方法就是让每个可能的字符串都具有与其相关的有效指令/用法。我看到的唯一方法是将所有操作都设置为单个字符,并确保为每个单个字符分配了一个操作。

有一百万个问题出在这里-显然没有保留字,这全都与它在上下文中的使用情况有关,因此,它基本上是难以辨认的,而且即使语法语法不受干扰,也很可能会遇到其他种类的问题错误。

因此,从理论上讲是可能的(AmmoQ给出的结果比I更加整洁),但完全不受欢迎。


我读过TECO就是这样,每个字符都被赋予了一个含义。
David Thornley

3
机器代码几乎可以这样工作。字节的每一个可能的组合,可以被看作是一个程序,它的东西,即使它的作用是产生一个中断。
user281377 2011年

大卫,这就是我的想法,非常喜欢TECO。尽管IIRC TECO输入可能包含语法错误。但这说明了这种密集语言的困难-很难阅读并且容易理解错误。
欧米茄半人马座

@ user281377:在6502上,有很多指令没有定义的含义。一些行为具有一致的,有用的,并且在任何已记录的指令中均不可用(我最喜欢的绰号是“ DCP”-减小存储器地址并将结果与​​累加器进行比较,并适当设置标志),但有些行为则取决于总线时序采用怪异而怪异的方式,有些会使处理器难以锁定,以至于需要复位(即使“不可屏蔽的”中断也无济于事)。我认为后面的说明可以被认为是“语法错误”。
2014年

5

非基于文本的编程语言中的代码可能没有语法错误。

我正在考虑像BYOB这样的视觉语言。您不能偶然输入“ if x ten else foo”,因为“语法”是由图形块定义的。


3

语法的主要目的是以比执行代码更快,更有效的方式区分有效和无效。语法只是一种优化,其中包含的内容和语义中包含的内容都是任意的。

通常,您希望得到相反的结果:尽可能地扩展语法以节省更多时间,但是当然您可以完全省略语法,并将每个错误声明为一个语义错误:您将得到一个非令牌化的解释器。


0

Ahbefiasdlk aslerhsofa; f jwi [ asdfasdf ] aew /&Q!@#$} {;-P

那是什么意思呢?

只要语言具有结构和语法,就总会有语法错误的概念。问题是您是否执行它。人们会犯错误,语法错误是大多数语言设计人员所追求的,以帮助程序员避免愚蠢的错误。

语法错误是程序员编写的对语言没有意义的代码所引起的错误。

根据以上定义不可能消除语法错误。我们都弄错了标识符,我们都弄错了方法名。让语言默默接受拼写错误并乐于做任何事情,这并不是我的愉快经历。

可以设计一种可以使用任何有效的unicode字符(或字符序列)作为标识符的语言。存在挑战,例如规范化等效的字符/字符序列,以便将它们识别为同一事物,但这是可能的。注意:Unicode规范化四种标准类型


1
对结构的需求不需要语法。考虑Piet的结构在网格中字符(或颜色)的位置,而不是它与词素中其他字符的关系。
Mike Samuel

1
违反结构,会发生什么?
Berin Loritsch 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.