#pragma once #include "Strings.hpp" #include "List.hpp" #include "Map.hpp" namespace tp { struct CfGrammar { struct Rule { struct Arg { String id; bool isTerminal = false; bool isEpsilon = false; }; String id; List args; }; List rules; String startTerminal; private: struct NonTerminal { List rules; Map references; Map referencing; }; struct Terminal {}; Map mTerminals; Map mNonTerminals; public: static struct CfGrammarParserState* initializeCfGrammarParser(); static void deinitializeCfGrammarParser(CfGrammarParserState*); public: bool parse(CfGrammarParserState* context, const String& source); bool compile(); bool isAmbiguous(); void optimize(); }; }