構文エラーのない言語を設計することは可能ですか?[閉まっている]


14

言い換えれば、すべての可能な文字列が有効な構文である言語ですか?

編集:これは理論的な質問です。そのような言語を使用する
ことに興味はありません。私はそれが可能かどうかを尋ねているだけです。

さらに編集する

そのような言語を設計しました。ErrorFreeを参照


2
それができれば、AIを作成できたはずです。
マイケルK

5
@マイケル:いいえ。そうは思いません。
SLaks

7
!!! Perl !!!

8
質問が閉じられていることに強く反対します!主観的でも建設的でもありません!!!
フェリックスDombek

1
正確に256の命令、128のレジスタ、およびの一般的な構文を使用してアセンブリ言語を使用してください。instruction operand*ここで、オペランドはレジスタまたは0〜127の数値(およびそれ以上はレジスタとして扱われます)マルチアリティ命令の場合、「0」が想定されます。
フェリックスドンベック

回答:


8

はい、特定の言語のすべての文字列に対して常に良好な最終状態で停止する決定論的チューリングマシンを作成する非常に分析的な方法でこれを見ると、それが可能であることがわかります。デモンストレーションは非常に簡単です。次のように、トランジション関数が1つだけのトランジション関数を備えた通常の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」とは何ですか。これらのいずれも定義されていない場合、参照フレームはありません。
ベリンロリチュ

1
申し訳ありませんが、この答えに対するチューリングマシンのアプローチを説明する簡単な方法はありません。このリンクを確認して、少し明確にしてください:en.wikipedia.org/wiki/Turing_machine
guiman

16

はい、もちろんそれは可能です。それは簡単なことです。

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

誰が「ノー」と言うことができるかわかりません。そうは言っても、そのような言語に意味のある意味を定義するのはかなり難しいかもしれませんが、それも可能です。空白を見てください。


言語がそれを無視する場合、それは有効なシスタックスですか?「tabtabspace」は有効な文字列ではありませんか?
マイケルK

1
言語のセマンティクスはそれに関する私の問題でしたが、哲学/言語学の適切なトピックから外れなければ、実際に議論することはできません。
StuperUser

2
マイケル:そのとおり。すべてが構文的に有効ですが、NOPになる可能性があります(特別な意味はありません)。たくさんのものを無視する言語には何の問題もありません。このサンプルプログラムでCが無視するすべてのものを見てください:int main(){3 ;;; / *コメント* /}
user281377

多くの人は、構文とセマンティクスの概念的な区別がないため、「いいえ」と言います。「コンパイルできませんか?構文エラーでなければなりません!」
fredoverflow

これには本当の意味がないため、多くの人が「いいえ」と言います。構造を追加するとすぐに(つまり、自己再帰的な構文解析ルール以上)、構文の概念が得られます。構造の違反は、構文に起因するエラーです。構文解析エラーは、パーサーがそのようなフラグを立てるかどうかに関係なく、構文エラーです。
ベリンロリチュ

5

有効な構文の意味に依存すると思います。

任意の文字列を受け入れ、特定の意味が規定されていないものはすべて無視する言語を設計できます。これは基本的に「構文エラーは取り除きますが、エラーではない」と言っているのと同じです-かなり無意味で、多くの理由で非常に望ましくありません。

それを超えて、構文エラーのない言語を作成できる唯一の方法は、すべての可能な文字列に有効な命令/使用法を関連付けることです。私がそれを確認できる唯一の方法は、すべての操作を単一の文字として使用し、すべての単一の文字に操作が割り当てられていることを確認することです。

これには数百万の間違いがあります-明らかに予約語はありません、それは文脈で使用されている場所に関するものであり、その結果、基本的に判読できず、構文エラーからの免疫は他のあらゆる種類を経験する可能性がはるかに高くなりますエラーの。

理論的には可能ですが(AmmoQは私よりもはるかにきちんとしています)、まったく望ましくありません。


TECOはそのようなもので、各キャラクターに意味が割り当てられていると読みました。
デビッド

3
マシンコードはほぼそのように機能します。考えられるすべてのバイトの組み合わせは、割り込みを引き起こしているだけでも、何かを行うプログラムと見なすことができます。
user281377

デビッド、私が考えていたのは、まさにTECOのようなものです。IIRC TECO入力には構文エラーが含まれる場合があります。しかし、それはそのような密な言語の難しさを示しています-非常に読みにくく、エラーを理解するのが難しい傾向があります。
オメガケンタウリ

@ user281377:6502には、意味が定義されていない非常に多くの命令があります。一貫性があり、便利で、文書化された命令では使用できない動作があります(私のお気に入りは「DCP」というニックネームです-メモリアドレスをデクリメントし、結果をアキュムレータと比較し、フラグを適切に設定します)。奇妙で奇妙な方法でのバスタイミング、およびリセットを必要とするほどハードにプロセッサをロックするものもあります(「マスク不可能」な割り込みでさえ助けにはなりません)。後者の指示は「構文エラー」とみなされると思います。
supercat 14年

5

非テキストベースのプログラミング言語のコードには構文エラーがない場合があります。

BYOBのような視覚言語を考えています。「構文」はグラフィカルブロックで定義されているため、誤って「if x ten else foo」と入力することはできません。


3

構文のまさに目的は、コードを実行するよりも速くて効果的な方法で、有効なものと無効なものを区別することです。構文は最適化にすぎず、その中に含まれるものとセマンティクスに含まれるものは任意です。

通常、あなたはまったく逆を望みます:より多くの時間を節約するために可能な限り構文を引き伸ばしますが、もちろん、構文を完全に省略し、すべてのエラーを意味的なものと宣言することもできます:あなたはトークン化されていないインタープリターになります。


0

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

それはどういう意味ですか?

言語に構造と文法がある限り、常に構文エラーの概念があります。問題は、それを実施するかどうかです。人々は間違いを犯し、構文エラーは、ほとんどの言語設計者がプログラマが愚かな間違いを避けるのを助けるために到達するものです。

構文エラーは、プログラマーが言語に意味のないコードを記述することによって生じるエラーです。

上記の定義に基づいて構文エラーを取り除くことは不可能です。識別子のつづりが間違っています。メソッド名のつづりが間違っています。言語が静かにスペルミスを受け入れて、幸せに何もしないことは、楽しい経験の私の考えではありません。

有効なUnicode文字(または文字シーケンス)を識別子として使用できる言語を設計することができます。同じものとして認識されるように同等の文字/文字シーケンスを正規化するなどの課題がありますが、それは可能です。注:Unicode正規化には4つの標準タイプがあります。


1
構造の必要性は、文法を必要としません。構造がグリッド内の文字(または色)の位置にあり、形態素内の他の文字との関係ではないPietを考えます。
マイクサミュエル

1
構造に違反するとどうなりますか?
ベリンロリチュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.