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