diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index 6ab533b41e236c6f3e9d1db90ba4e31020d902da..ca55f2de79bfccdb8621644720a47869d90bdbb7 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -54,6 +54,8 @@ struct character : if_must_else< one< '\\' >, escaped_c, ascii::any> {}; struct literal : if_must< one< '"' >, until< one< '"' >, character > > {}; +struct import_kw : TAO_PEGTL_KEYWORD("import") {}; + struct LITERAL : seq< literal, ignored >{}; struct REAL : seq< real, ignored >{}; @@ -108,10 +110,15 @@ struct cout_kw : TAO_PEGTL_KEYWORD("cout") {}; struct cerr_kw : TAO_PEGTL_KEYWORD("cerr") {}; struct clog_kw : TAO_PEGTL_KEYWORD("clog") {}; -struct keywork : sor < basic_type, true_kw, false_kw, do_kw, while_kw, for_kw, if_kw, else_kw, and_kw, or_kw, xor_kw, break_kw, continue_kw, cout_kw, cerr_kw, clog_kw > {}; +struct keywork : sor < basic_type, import_kw, true_kw, false_kw, let_kw, do_kw, while_kw, for_kw, if_kw, else_kw, and_kw, or_kw, xor_kw, break_kw, continue_kw, cout_kw, cerr_kw, clog_kw > {}; + +struct identifier_minus_keyword : minus< identifier, keywork > {}; -struct name : minus< identifier, keywork > {}; -struct NAME : seq < name, ignored > {}; +struct module_name : identifier_minus_keyword {}; +struct MODULE_NAME : seq< module_name, ignored > {}; + +struct name : identifier_minus_keyword {}; +struct NAME : seq< name, ignored > {}; struct right_arrow_kw : seq< one< '-' >, one< '>' > > {}; struct RIGHT_ARROW : seq< right_arrow_kw, ignored > {}; @@ -269,8 +276,14 @@ struct for_statement_block : seq< sor< braced_instruction_list, instruction >, ignored >{}; +struct IMPORT : seq< import_kw, ignored >{}; + +struct import_instruction : if_must< IMPORT, MODULE_NAME , semicol >{}; +struct IMPORT_INSTRUCTION : seq<import_instruction, ignored> {}; +struct import_list : star< IMPORT_INSTRUCTION > {}; + struct instruction_list : star< INSTRUCTION >{}; -struct grammar : must<ignored, instruction_list, eof>{}; +struct grammar : must<ignored, import_list, instruction_list, eof>{}; template <typename Rule> struct errors : public normal<Rule> @@ -288,6 +301,11 @@ struct errors : public normal<Rule> template <typename Rule> inline const std::string errors<Rule>::error_message = "parse error matching "+ internal::demangle< Rule >(); +template <> +inline const std::string errors<language::module_name>::error_message = "parse error, missing module name"; +template <> +inline const std::string errors<language::MODULE_NAME>::error_message = "parse error, missing module name"; + template <> inline const std::string errors<language::semicol>::error_message = "parse error, missing ';'"; template <>