構文と文法の違いは何ですか?


14

構文とセマンティクスの違いを理解しています-

構文:シンボルを組み合わせて有効な式またはステートメントを形成する方法。
セマンティクス:式またはステートメントを形成する記号の意味。

しかし、文法は何ですか?たとえば、ある構文は「文法的には間違っているが、構文的には正しい」と人々が言うのを時々聞きます。どういう意味ですか?


FWIW、これは私にはナンセンスのように聞こえます。言語の文法がコードを受け入れた場合、構文に準拠します。おそらく、誰かが「構文」の非常に広範な(そして非標準の)定義を持っているでしょう。コンテキスト/ソース?

@delnan。違います。たとえば、int;文法的には有効ですが、C ++では構文が正しくありません。このコードでは文法に問題はありませんが、宣言の最初の部分にclass-specifierまたはenum-specifierが含まれていない場合、またはC ++ 11ではfriend-specifierが含まれていない場合、構文制約により名前を指定する必要があります
ヨハネスシャウブ-litb

@ JohannesSchaub-litb:これを有効にする文法の部分を引用することに注意してください。

@Johanesそれは問題の状況の逆です。
ニコール

2
@ Johannes Schaub:どのようなルールが「int;」を作りますか 有効ですか?文法は構文を定義します。
ケーシーパットン

回答:


6

文法は、特定の言語の構文を定義する一連の規則です。

人々がパーサー(特にyacc、Byacc、ANTLRなどのパーサージェネレーターで生成されたもの)について特に話しているとき、彼らはもう少し髪を分割し、ジェネレーターを使用してエンコードされた構文規則について特に話します。ルールと、ルールに添付されたコードによって個別に適用される部分。たとえば、Cで配列を定義する場合、配列に指定するサイズは厳密に正(ゼロではない)でなければなりません。文法規則は基本的に次のように言うかもしれません:

typename var_name '[' unsigned_int ']'

...そして別に、unsigned_intがゼロでないことをチェックするコードが少しあります。この場合、それは可能性が 2は、わずかに異なる要件を持つ(、一緒に施行することを、私たちは言語自体の要件に合わせて推測)、構文と互いに別に文法の要件についての話をいくつかの意味をなします。


3

違いはあいまいであり、あまり心配する価値はありません。

人々は、構文の正確さの傘の下に状況依存制約を含めることがあります。最も一般的な例は型システムです。もう1つは、Javaの「復帰後のステートメントなし」ルールです。これにより、正式な議論が簡素化されます。構文は、セマンティクスのドメインである言語(一連の文/式/プログラム)を生成します。それ以外のものは「プログラムではなく」、セマンティクスはそれを気にする必要はありません。

対照的に、「文法」とは通常、文脈自由言語を記述する方法を指します(属性にかかわらず、文法)。

あまり心配する価値がない理由は、型システムは「正確さの構文規則」であるのと同じくらい頻繁に言語の「静的セマンティクス」と見なされるためです。また、言語には適切な文脈自由文法がまったくない場合があります。たとえば、Cはパーサーからの情報をレクサーにフィードバックする必要があります。

実用的には、「構文」と「文法」の区別に依存する人は誰でもそう言って、それらが何を意味するのかを説明した方が良いでしょう。


なぜその違いがあいまいなのかわかりません。文法は構文を説明しています。
ケーシーパットン

1
@Casey、いいえ、「構文」という単語の1つの用法によると、文法は構文のスーパーセットを指定します。
ライアンカルペッパー

0

文法は、言語を定義する一連のルールです。むしろ、文法は構文とセマンティクスを説明しています。言語には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を見てください。これは基本的に言語の文法を記述するためのツールです。

「文法的には間違っているが、構文的には正しい」というのはあまり意味がありません。言語のセマンティクスを説明する文法に言及しているのかもしれません。ただし、「意味的に正しくない」と言う方が確かに意味があります。


7
それはのようなエキゾチックなもの、しない限り、文法は、セマンティクスを定義しないと、それを行うべきではありませんcontextfreeart.org
SK-ロジック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.