module languages/ansi-c/syntax/C
%% This grammar is a transformed version from the ANSI-C grammar.
%% It has far less sorts, because more priorities have been used,
%% and optionals and lists have been inlined.
%%
%% It accepts more than ANSI-C because:
%% * more combinations of Expressions are allowed, while still remaining
%% unambiguous, and priorities are according to the ANSI-C standard.
%% * All type specifiers have been put into one non-terminal, so this
%% grammar accepts more type incorrect C code than the ANSI-C grammar.
%% For example: int main(static int a) is accepted, but illegal in ANSI-C.
%%
%% DONT: do not try to fully disambiguate this grammar because that would ruin
%% its declarative nature. C is ambiguous. However, the expression
%% grammar should be fully unambiguous (Expression).
imports languages/ansi-c/syntax/Declarations
imports languages/ansi-c/syntax/Statements
exports
sorts ExternalDeclaration FunctionDefinition TranslationUnit
context-free syntax
ExternalDeclaration+ -> TranslationUnit
context-free syntax
FunctionDefinition -> ExternalDeclaration
Declaration -> ExternalDeclaration
context-free syntax
Specifier* Declarator Declaration* "{" Declaration* Statement* "}" -> FunctionDefinition