Parse a primary expression.
This is called when we expect an expression.
We read a token.
If the token is an identifier or a constant, that is the whole expression.
If the token is a string literal, we read zero or more that may follow, and we have a string literal expression. Recall that C supports automatically concatenated adjacent string literals, and that our abstract syntax preserves the distinct string literals.
If the token is an open parenthesis, we read another token to see whether it is an open curly brace. If it is, we have a statement expression (a GCC extension); otherwise, we have a parenthesized expression. We only allow this if GCC extensions are supported.
If the token is the keyword
If the token is the GCC keyword
If the token is the GCC keyword
If the token is none of the above, including the token being absent, it is an error.