using AST; using static Parsing.ParserCombinator; namespace Parsing { public partial class CParsers { /// /// translation-unit /// : [external-declaration]+ /// public static NamedParser TranslationUnit { get; } = new NamedParser("translation-unit"); /// /// external-declaration /// : function-definition | declaration /// public static NamedParser ExternalDeclaration { get; } = new NamedParser("external-declaration"); /// /// function-definition /// : [declaration-specifiers]? declarator [declaration-list]? compound-statement /// /// NOTE: the optional declaration_list is for the **old-style** function prototype like this: /// +-------------------------------+ /// | int foo(param1, param2) | /// | int param1; | /// | char param2; | /// | { | /// | .... | /// | } | /// +-------------------------------+ /// /// i'm **not** going to support this style. function prototypes should always be like this: /// +------------------------------------------+ /// | int foo(int param1, char param2) { | /// | .... | /// | } | /// +------------------------------------------+ /// /// so the grammar becomes: /// function-definition /// : [declaration-specifiers]? declarator compound-statement /// public static NamedParser FunctionDefinition { get; } = new NamedParser("function-definition"); public static void SetExternalDefinitionRules() { // translation-unit // : [external-declaration]+ TranslationUnit.Is( (ExternalDeclaration) .OneOrMoreForEntireUnit() .Then(TranslnUnit.Create) ); // external-declaration // : function-definition | declaration ExternalDeclaration.Is( Either( FunctionDefinition ).Or( Declaration ) ); // function-definition // : [declaration-specifiers]? declarator compound-statement FunctionDefinition.Is( DeclarationSpecifiers.Optional() .Then(Declarator) .Then(CompoundStatement) .Then(FuncDef.Create) ); } } }