This grammar admits expressions like 33 and 2 + 88 + 344. That's syntax.
But how the language interprets those expressions is semantics. Continuing our calculator example:
1. Every expr evaluates to an integer value.
2. An expr of the form `<digits> EOF` evaluates to the integer given by interpreting the digits in <digits> as an integer in base 10.
3. If <expr> evaluates to the value x, then an expr of the form `<digits> + <expr>` evaluates to the value y + x, where y is the integer given by interpreting the digits in <digits> as an integer in base 10.
Of course, specifying semantics in human language is tedious and hard to make precise. For this reason, most programming languages give their semantics in a more formalized language. See, for a classic example, the R5RS specs for Scheme:
Consider a simple calculator language that lets you add positive integers.
The syntax might give grammar rules like:
This grammar admits expressions like 33 and 2 + 88 + 344. That's syntax.But how the language interprets those expressions is semantics. Continuing our calculator example:
1. Every expr evaluates to an integer value.
2. An expr of the form `<digits> EOF` evaluates to the integer given by interpreting the digits in <digits> as an integer in base 10.
3. If <expr> evaluates to the value x, then an expr of the form `<digits> + <expr>` evaluates to the value y + x, where y is the integer given by interpreting the digits in <digits> as an integer in base 10.
Of course, specifying semantics in human language is tedious and hard to make precise. For this reason, most programming languages give their semantics in a more formalized language. See, for a classic example, the R5RS specs for Scheme:
https://conservatory.scheme.org/schemers/Documents/Standards...