構文と意味の違いを理解しています-
構文:シンボルを組み合わせて有効な式またはステートメントを形成する方法。
Semantics:式またはステートメントを形成するシンボルの意味。
しかし、文法は何ですか?たとえば、ある構文が「文法的には正しくないが、構文的には正しい」と人々が言うのを聞くことがあります。どういう意味ですか?
文法は、特定の言語の構文を定義する一連のルールです。
パーサー(特にyacc、Byacc、ANTLRなどのパーサージェネレーターで生成されたパーサー)について具体的に話しているときは、少々細かく分割し、ジェネレーターを使用してエンコードされている構文規則について具体的に話します。ルールと、ルールに添付されたコードによって個別に適用される部分の比較。たとえば、Cで配列を定義する場合、配列に指定するサイズは厳密に正(ゼロではない)でなければなりません。文法規則は基本的に次のようなものを言うかもしれません:
typename var_name '[' unsigned_int ']'
...そして個別に、unsigned_intがゼロ以外であることを確認するコードが少しあります。この場合、それはcould構文と文法の要件を互いに別々に話すことには意味があり、2つはわずかに異なる要件を持っています(一緒に強制されるため、要件に適合すると仮定します)言語自体の)。
違いはあいまいで、あまり心配する価値はありません。
構文の正確さの傘の下にcontext-sensitive制約が含まれることがあります。最も一般的な例は型システムです。もう1つは、Javaの「復帰後のステートメントなし」ルールです。これにより、正式なディスカッションが簡素化されます。構文により、セマンティクスのドメインである言語(一連の文/式/プログラム)が生成されます。それ以外は「プログラムではない」ものであり、セマンティクスはそれを気にする必要はありません。
対照的に、「文法」は通常、context-free言語(属性文法にもかかわらず)を記述する方法を指します。
あまり気にする必要がない理由は、型システムは「構文正当性の規律」であるのと同様に、言語の「静的セマンティクス」と見なされることが多いためです。また、言語には適切な文脈自由文法がまったくない場合があります。たとえば、Cはパーサーからレクサーに情報をフィードバックする必要があります。
実用的には、「構文」と「文法」の区別に依存している人はだれでもそう言って、それらの意味を説明したほうがよいでしょう。
文法は、言語を定義するための一連のルールです。むしろ、文法は構文と意味論を説明します。言語には2つの異なる文法があります。
たとえば、Cの文法の一部は次のようになります。
if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...
意味:
an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....
文法を定義するこの方法 を見てください。文法に本当に興味があるなら、基本的に言語の文法を記述するためのツールである GNU Bison を見てください。
「文法的には正しくても構文的には正しい」というのはあまり意味がありません。多分彼らは言語の意味論を説明する文法を参照しているのでしょう。ただし、「意味的に正しくない」とだけ言ったほうが理にかなっています。