diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..5b3d13f
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1 @@
+build --cxxopt=-std=c++17
diff --git a/Action.g4 b/Action.g4
new file mode 100644
index 0000000..f8ecea1
--- /dev/null
+++ b/Action.g4
@@ -0,0 +1,56 @@
+// Grammar for C++ runtime actions
+grammar Action;
+
+import ModuleLex;
+
+@header {
+  #include <stack>
+}
+
+@parser::members {
+  void skipToEndOfObject() {
+    std::stack<char> curly_stack;
+    int t = _input->LA(1);
+    while (t != antlr4::Token::EOF &&
+           !(curly_stack.empty() && t == CLOSING_CURLY)) {
+      if (t == PRE_ELSE) {
+        std::stack<char> if_def_stack;
+        consume();
+        t = _input->LA(1);
+
+        while (t != antlr4::Token::EOF &&
+              !(if_def_stack.empty() && (t == PRE_ENDIF))) {
+          if (t == PRE_IF) if_def_stack.push(0);
+          else if (t == PRE_ENDIF) if_def_stack.pop();
+            consume();
+            t = _input->LA(1);
+        }
+      }
+      if (t == OPENING_CURLY) curly_stack.push(0);
+      else if (t == CLOSING_CURLY) curly_stack.pop();
+      consume();
+      t = _input->LA(1);
+    }
+    if (t != antlr4::Token::EOF) consume();
+  }
+
+  void preProcSkipToEnd() {
+    std::stack<char> curly_stack;
+    int t = _input->LA(1);
+
+    while(t != antlr4::Token::EOF &&
+          !(curly_stack.empty() && t == PRE_ENDIF)){
+
+        if(t == PRE_IF) curly_stack.push(0);
+        else if(t == PRE_ENDIF) curly_stack.pop();
+
+        consume();
+        t = _input->LA(1);
+    }
+    if(t != antlr4::Token::EOF) consume();
+}
+}
+
+skip_to_end_of_object: {skipToEndOfObject();};
+
+pre_proc_skip_to_end: {preProcSkipToEnd();};
diff --git a/BUILD.bazel b/BUILD.bazel
new file mode 100644
index 0000000..8e75002
--- /dev/null
+++ b/BUILD.bazel
@@ -0,0 +1,117 @@
+# Bazel build rules for Fuzzyc.
+load("@fuzzyc_deps//:requirements.bzl", "requirement")
+
+genrule(
+    name = "fuzzyc_cc_module_sources",
+    srcs = [
+        "Common.g4",
+        "Module.g4",
+        "ModuleLex.g4",
+        "Action.g4",
+    ],
+    outs = [
+        "ModuleParser.cpp",
+        "ModuleParser.h",
+        "ModuleLexer.cpp",
+        "ModuleLexer.h",
+        "ModuleListener.h",
+        "ModuleListener.cpp",
+        "ModuleBaseListener.cpp",
+        "ModuleBaseListener.h",
+    ],
+    cmd = "$(locations @fuzzyc_deps_antlr4_tools//:rules_python_wheel_entry_point_antlr4) -o $(@D) -Dlanguage=Cpp -package fuzzyc_cc_module $(SRCS)",
+    tools = [
+        requirement("antlr4-tools"),
+        "@fuzzyc_deps_antlr4_tools//:rules_python_wheel_entry_point_antlr4",
+    ],
+)
+
+genrule(
+    name = "fuzzyc_cc_function_sources",
+    srcs = [
+        "Common.g4",
+        "Function.g4",
+        "ModuleLex.g4",
+        "Action.g4",
+    ],
+    outs = [
+        "FunctionParser.cpp",
+        "FunctionParser.h",
+        "FunctionLexer.cpp",
+        "FunctionLexer.h",
+        "FunctionListener.h",
+        "FunctionListener.cpp",
+        "FunctionBaseListener.cpp",
+        "FunctionBaseListener.h",
+    ],
+    cmd = "$(locations @fuzzyc_deps_antlr4_tools//:rules_python_wheel_entry_point_antlr4) -o $(@D) -Dlanguage=Cpp -package fuzzyc_cc_function $(SRCS)",
+    tools = [
+        requirement("antlr4-tools"),
+        "@fuzzyc_deps_antlr4_tools//:rules_python_wheel_entry_point_antlr4",
+    ],
+)
+
+cc_library(
+    name = "fuzzyc_cc_module",
+    srcs = [
+        "ModuleBaseListener.cpp",
+        "ModuleLexer.cpp",
+        "ModuleListener.cpp",
+        "ModuleParser.cpp",
+    ],
+    hdrs = [
+        "ModuleBaseListener.h",
+        "ModuleLexer.h",
+        "ModuleListener.h",
+        "ModuleParser.h",
+    ],
+    copts = [
+        "-fexceptions",
+        "-Wno-nonnull",
+        "-std=c++17",
+    ],
+    linkstatic = 1,
+    deps = [
+        ":fuzzyc_cc_module_sources",
+        "@antlr4_runtimes//:cpp",
+    ],
+)
+
+cc_library(
+    name = "fuzzyc_cc_function",
+    srcs = [
+        "FunctionBaseListener.cpp",
+        "FunctionLexer.cpp",
+        "FunctionListener.cpp",
+        "FunctionParser.cpp",
+    ],
+    hdrs = [
+        "FunctionBaseListener.h",
+        "FunctionLexer.h",
+        "FunctionListener.h",
+        "FunctionParser.h",
+    ],
+    copts = [
+        "-fexceptions",
+        "-Wno-nonnull",
+    ],
+    linkstatic = 1,
+    deps = [
+        ":fuzzyc_cc_function_sources",
+        "@antlr4_runtimes//:cpp",
+    ],
+)
+
+cc_test(
+    name = "fuzzyc_cc_test",
+    srcs = ["tests/fuzzyc_cc_test.cc"],
+    data = ["tests/testdata"],
+    deps = [
+        ":fuzzyc_cc_function",
+        ":fuzzyc_cc_module",
+        "@antlr4_runtimes//:cpp",
+        "@com_google_absl//absl/status",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/Common.g4 b/Common.g4
new file mode 100644
index 0000000..3c8764b
--- /dev/null
+++ b/Common.g4
@@ -0,0 +1,168 @@
+grammar Common;
+
+import ModuleLex, Action;
+
+unary_operator : '&' | '*' | '+'| '-' | '~' | '!';
+relational_operator: ('<'|'>'|'<='|'>=');
+
+constant
+    :   HEX_LITERAL
+    |   OCTAL_LITERAL
+    |   DECIMAL_LITERAL
+    |   BINARY_LITERAL
+	|	STRING
+	|   MULTILINE_STRING
+    |   CHAR
+    |   FLOATING_POINT_LITERAL
+    ;
+
+// keywords & operators
+
+function_decl_specifiers: ('inline' | 'virtual' | 'explicit' | 'friend' | 'static');
+ptr_operator: ('*' | '&');
+
+access_specifier: ('public' | 'private' | 'protected');
+
+operator: (('new' | 'delete' ) ('[' ']')?)
+  | '+' | '-' | '*' | '/' | '%' |'^' | '&' | '|' | '~'
+  | '!' | '=' | '<' | '>' | '+=' | '-=' | '*='
+  | '/=' | '%=' | '^=' | '&=' | '|=' | '>>'
+  |'<<'| '>>=' | '<<=' | '==' | '!='
+  | '<=' | '>=' | '&&' | '||' | '++' | '--'
+  | ',' | '->*' | '->' | '(' ')' | '[' ']'
+  ;
+
+assignment_operator: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=';
+equality_operator: ('=='| '!=');
+
+// TODO: Does not support default types (e.g. template<typename N = int>). To achieve extend template_decl_param.
+template_decl: TEMPLATE '<' template_decl_param_list? '>';
+template_decl_param_list: template_template template_decl_keyword template_name |
+                          template_decl_param |
+                          template_decl_param_list ',' template_decl_param;
+template_template: TEMPLATE '<' (template_decl_keyword ','?)+ '>';
+template_decl_param: (template_decl_keyword | CV_QUALIFIER? identifier) template_name? ptr_operator?;
+template_decl_keyword: 'typename' | 'class';
+template_name: ALPHA_NUMERIC+ ELLIPSIS? ;
+
+template_args: '<' template_args_param_list? '>';
+template_args_param_list: template_args_param |
+                          template_args_param_list ',' template_args_param;
+template_args_param: CV_QUALIFIER? base_type ptr_operator?;
+
+// water
+
+no_brackets: ~('(' | ')');
+no_brackets_curlies_or_squares: ~('(' | ')' | '{' | '}' | '[' | ']');
+no_brackets_or_semicolon: ~('(' | ')' | ';');
+no_angle_brackets_or_brackets : ~('<' | '>' | '(' | ')');
+no_curlies: ~('{' | '}');
+no_squares: ~('[' | ']');
+no_squares_or_semicolon: ~('[' | ']' | ';');
+no_comma_or_semicolon: ~(',' | ';');
+
+assign_water: ~('(' | ')' | '{' | '}' | '[' | ']' | ';' | ',');
+assign_water_l2: ~('(' | ')' | '{' | '}' | '[' | ']');
+
+water: .;
+
+
+
+// operator-identifiers not implemented
+identifier : (ALPHA_NUMERIC ('::' ALPHA_NUMERIC)*) | access_specifier;
+number: HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL;
+
+ptrs: (CV_QUALIFIER? ptr_operator 'restrict'?)+;
+func_ptrs: ptrs;
+rvalue_ref: '&&';
+
+class_key: 'struct' | 'class' | 'union' | 'enum';
+
+class_def: template_decl* class_key gcc_attribute? class_name? template_args? base_classes? OPENING_CURLY skip_to_end_of_object;
+class_name: identifier;
+base_classes: ':' base_class (',' base_class)*;
+base_class: VIRTUAL? access_specifier? identifier template_args?;
+
+
+type_name : (CV_QUALIFIER* (class_key | UNSIGNED | SIGNED)?
+            base_type template_args? ('::' base_type template_args? )*) CV_QUALIFIER?
+          | UNSIGNED
+          | SIGNED
+          ;
+
+base_type: ((ALPHA_NUMERIC | AUTO | VOID | LONG | LONG) ELLIPSIS?)+;
+
+gcc_attribute: GCC_ATTRIBUTE '(' '(' identifier ')' ')';
+
+expr: assign_expr (',' expr)?;
+
+assign_expr: conditional_expression (assignment_operator assign_expr)?;
+conditional_expression: or_expression #normOr
+		      | or_expression ('?' expr ':' conditional_expression) #cndExpr;
+
+
+or_expression : and_expression ('||' or_expression)?;
+and_expression : inclusive_or_expression ('&&' and_expression)?;
+inclusive_or_expression: exclusive_or_expression ('|' inclusive_or_expression)?;
+exclusive_or_expression: bit_and_expression ('^' exclusive_or_expression)?;
+bit_and_expression: equality_expression ('&' bit_and_expression)?;
+equality_expression: relational_expression (equality_operator equality_expression)?;
+relational_expression: shift_expression (relational_operator relational_expression)?;
+shift_expression: additive_expression ( ('<<'|'>>') shift_expression)?;
+additive_expression: multiplicative_expression (('+'| '-') additive_expression)?;
+multiplicative_expression: cast_expression ( ('*'| '/'| '%') multiplicative_expression)?;
+
+cpp_cast_identifier: 'const_cast' | 'static_cast' | 'dynamic_cast' | 'reinterpret_cast';
+
+cast_expression: ('(' cast_target ')' cast_expression)
+               | cpp_cast_identifier '<' cast_target '>' '(' cast_expression ')'
+               | unary_expression
+;
+
+cast_target: type_name ptr_operator*;
+
+unary_expression: inc_dec cast_expression
+                | unary_op_and_cast_expr
+                | sizeof_expression
+                | new_expression
+                | delete_expression
+                | postfix_expression
+                ;
+
+new_expression: '::'? NEW type_name '[' conditional_expression? ']'
+              | '::'? NEW type_name '(' expr? ')'
+              ;
+
+delete_expression: DELETE identifier |
+                   DELETE '[' ']' identifier;
+
+unary_op_and_cast_expr: unary_operator cast_expression;
+
+sizeof_expression: sizeof sizeof_operand2
+                 | sizeof '(' sizeof_operand2 ')'
+                 | sizeof '(' sizeof_operand ')';
+
+sizeof: 'sizeof';
+
+sizeof_operand: type_name ptr_operator *;
+sizeof_operand2: unary_expression;
+
+inc_dec: ('--' | '++');
+
+// this is a bit misleading. We're just allowing access_specifiers
+// here because C programs can use 'public', 'protected' or 'private'
+// as variable names.
+
+postfix_expression: postfix_expression '[' expr ']' #arrayIndexing
+                  | postfix_expression '(' function_argument_list ')' #funcCall
+                  | postfix_expression '.' TEMPLATE? (identifier) #memberAccess
+                  | postfix_expression '->' TEMPLATE? (identifier) #ptrMemberAccess
+                  | postfix_expression inc_dec #incDecOp
+                  | primary_expression # primaryOnly
+                  ;
+
+function_argument_list: ( function_argument (',' function_argument)* )?;
+function_argument: assign_expr;
+
+
+primary_expression: identifier | constant | '(' expr ')';
diff --git a/Function.g4 b/Function.g4
new file mode 100644
index 0000000..51be44f
--- /dev/null
+++ b/Function.g4
@@ -0,0 +1,107 @@
+grammar Function;
+import ModuleLex, Common;
+
+statements: (pre_opener
+            | pre_closer
+            | pre_else pre_proc_skip_to_end
+            | statement)*;
+
+statement: opening_curly
+         | closing_curly
+         | block_starter
+         | jump_statement
+         | label
+         | simple_decl
+         | expr_statement
+         | water
+        ;
+
+pre_opener: PRE_IF;
+pre_else: PRE_ELSE;
+pre_closer: PRE_ENDIF;
+opening_curly: '{';
+closing_curly: '}';
+
+block_starter: selection_or_iteration;
+
+selection_or_iteration: TRY                      #Try_statement
+                      | CATCH '(' (param_type | ELLIPSIS) ')' #Catch_statement
+                      | IF '(' condition ')'     #If_statement
+                      | ELSE                     #Else_statement
+                      | SWITCH '(' condition ')' #Switch_statement
+                      | FOR '(' (for_init_statement | ';') condition? ';'  expr? ')' #For_statement
+                      | DO                          #Do_statement
+                      | WHILE '(' condition ')'     #While_statement
+;
+
+// Don't know why, but: introducing this unused rule results
+// in a performance boost.
+
+do_statement1: DO statement WHILE '(' expr ')';
+
+for_init_statement : simple_decl
+                   | expr ';'
+                   ;
+
+jump_statement: BREAK ';'		#breakStatement
+              | CONTINUE ';' 		#continueStatement
+              | GOTO identifier ';'	#gotoStatement
+              | RETURN expr? ';'	#returnStatement
+              | THROW expr?  ';'	#throwStatement
+              ;
+
+label: CASE? (identifier | number | CHAR ) ':' ;
+
+expr_statement: expr? ';';
+
+condition: expr
+	 | type_name declarator '=' assign_expr;
+
+
+// Copied from FineSimpleDecl.g4
+
+init_declarator: declarator '(' expr? ')' #initDeclWithCall
+               | declarator '=' initializer #initDeclWithAssign
+               | declarator #initDeclSimple
+               ;
+
+declarator: ptrs? identifier template_args? type_suffix? |
+            ptrs? '(' func_ptrs identifier ')' type_suffix;
+
+type_suffix : ('[' conditional_expression? ']') | param_type_list;
+
+// Copied from SimpleDecl.g4
+
+simple_decl : (TYPEDEF?) var_decl;
+
+var_decl : class_def init_declarator_list? #declByClass
+         | template_decl* type_name init_declarator_list #declByType
+         ;
+
+init_declarator_list: init_declarator (',' init_declarator)* ';';
+
+initializer: assign_expr
+           |'{' initializer_list '}'
+;
+
+initializer_list: initializer (',' initializer)* ','?
+                | '.' initializer (',' '.' initializer)* ','?
+                | conditional_expression (',' conditional_expression)* ','
+                | identifier ':' conditional_expression (',' identifier ':' conditional_expression)* ','?
+                ;
+
+// Parameters
+
+param_decl_specifiers : (AUTO | REGISTER)? type_name;
+
+// this is a bit misleading. We're just allowing access_specifiers
+// here because C programs can use 'public', 'protected' or 'private'
+// as variable names.
+
+parameter_name: identifier;
+
+param_type_list: '(' VOID ')'
+               | '(' (param_type (',' param_type)*)? ')';
+
+param_type: param_decl_specifiers param_type_id;
+param_type_id: (ptrs | rvalue_ref)? ('(' param_type_id ')' | parameter_name?) type_suffix?;
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e72bfdd
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
\ No newline at end of file
diff --git a/Module.g4 b/Module.g4
new file mode 100644
index 0000000..6c37a4d
--- /dev/null
+++ b/Module.g4
@@ -0,0 +1,104 @@
+grammar Module;
+
+import ModuleLex, Common;
+
+/*
+    Copyright (C) 2013 Fabian 'fabs' Yamaguchi <fabs@phenoelit.de>
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+code : (function_decl | function_def | simple_decl | using_directive | water)*;
+
+using_directive: USING NAMESPACE identifier ';';
+
+function_decl: ('extern'? | template_decl*) return_type? function_name function_param_list ctor_list? ';';
+
+function_def: template_decl* return_type? function_name function_param_list ctor_list? compound_statement;
+
+return_type : (function_decl_specifiers* type_name) ptr_operator*;
+
+function_param_list : '(' parameter_decl_clause? ')' CV_QUALIFIER* exception_specification?;
+
+parameter_decl_clause: (parameter_decl (',' parameter_decl)*) (',' '...')?
+                     | VOID;
+parameter_ptrs: ptrs | rvalue_ref;
+parameter_decl: param_decl_specifiers parameter_id |
+                param_decl_specifiers parameter_ptrs?;
+parameter_id: parameter_ptrs? ('(' parameter_id ')' | parameter_name) type_suffix? default_parameter_value?;
+default_parameter_value: '=' expr;
+
+compound_statement: OPENING_CURLY skip_to_end_of_object;
+
+ctor_list: ':'  ctor_initializer (',' ctor_initializer)*;
+ctor_initializer:  initializer_id ctor_expr;
+initializer_id : '::'? identifier;
+ctor_expr:  '(' expr? ')';
+
+function_name: '(' function_name ')' | identifier | OPERATOR operator;
+
+exception_specification : THROW '(' type_id_list ')';
+type_id_list: no_brackets* ('(' type_id_list ')' no_brackets*)*;
+
+
+
+// The following two contain 'water'-rules for expressions
+
+init_declarator : declarator (('(' expr? ')') | ('=' assign_expr_w_))?;
+declarator: ptrs? identifier template_args? type_suffix? |
+            ptrs? '(' func_ptrs identifier ')' type_suffix;
+
+type_suffix : ('[' constant_expr_w_ ']') | param_type_list;
+
+// water rules for expressions
+
+assign_expr_w_: assign_water*
+        (('{' assign_expr_w__l2 '}' | '(' assign_expr_w__l2 ')' | '[' assign_expr_w__l2 ']')
+             assign_water*)*;
+
+assign_expr_w__l2: assign_water_l2* (('{' assign_expr_w__l2 '}' | '(' assign_expr_w__l2 ')' | '[' assign_expr_w__l2 ']')
+             assign_water_l2*)*;
+
+constant_expr_w_: no_squares* ('[' constant_expr_w_ ']' no_squares*)*;
+
+simple_decl : storage_class_specifier* var_decl;
+
+storage_class_specifier: (EXTERN | TYPEDEF);
+
+var_decl : class_def init_declarator_list? #declByClass
+         | template_decl* type_name init_declarator_list #declByType
+         ;
+
+init_declarator_list: init_declarator (',' init_declarator)* ';';
+
+initializer: assign_expr
+           |'{' initializer_list '}'
+;
+
+initializer_list: initializer (',' initializer)*;
+
+// Parameters
+
+param_decl_specifiers : (AUTO | REGISTER)? type_name;
+
+// this is a bit misleading. We're just allowing access_specifiers
+// here because C programs can use 'public', 'protected' or 'private'
+// as variable names.
+
+parameter_name: identifier;
+
+param_type_list: '(' VOID ')'
+               | '(' (param_type (',' param_type)*)? ')';
+
+param_type: param_decl_specifiers param_type_id;
+param_type_id: ptrs? ('(' param_type_id ')' | parameter_name?) type_suffix?;
diff --git a/ModuleLex.g4 b/ModuleLex.g4
new file mode 100644
index 0000000..dee4abf
--- /dev/null
+++ b/ModuleLex.g4
@@ -0,0 +1,117 @@
+lexer grammar ModuleLex;
+
+// Keywords shared among C/C++/Java
+
+IF: 'if'; ELSE: 'else'; FOR: 'for'; WHILE: 'while';
+
+BREAK: 'break'; CASE: 'case'; CONTINUE: 'continue'; 
+SWITCH: 'switch'; DO: 'do';
+
+GOTO: 'goto'; RETURN: 'return';
+
+TYPEDEF: 'typedef';
+EXTERN: 'extern';
+VOID: 'void'; UNSIGNED: 'unsigned'; SIGNED: 'signed';
+LONG: 'long'; CV_QUALIFIER :  'const' | 'constexpr' | 'volatile';
+
+// Keywords shared among C++/Java
+
+VIRTUAL: 'virtual';
+TRY: 'try'; CATCH: 'catch'; THROW: 'throw';
+USING: 'using'; NAMESPACE: 'namespace'; 
+
+// Keywords shared among C/C++
+
+AUTO: 'auto'; REGISTER: 'register';
+
+// C++ keywords
+
+OPERATOR: 'operator';
+TEMPLATE: 'template';
+NEW: 'new';
+DELETE: 'delete';
+
+GCC_ATTRIBUTE : '__attribute__';
+
+ALPHA_NUMERIC: [a-zA-Z_~][a-zA-Z0-9_]*;
+
+OPENING_CURLY: '{';
+CLOSING_CURLY: '}';
+
+// pre-processor directives: C/C++
+
+PRE_IF: ('#if' | '#ifdef' | '#ifndef') ~[\r\n]* '\r'? '\n';
+PRE_ELSE: ('#else' | '#elif') ~[\r\n]* '\r'? '\n';
+PRE_ENDIF: '#endif' ~[\r\n]* '\r'? '\n';
+// PREPROC : '#' ~[\r\n]* '\r'? '\n' -> skip;
+PRE_DEFINE: '#define' ~[\r\n]* '\r'? '\n' -> skip;
+
+
+HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
+DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
+OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
+BINARY_LITERAL : '0b' ( '0' | '1')+ IntegerTypeSuffix? ;
+
+FLOATING_POINT_LITERAL
+    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
+    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent FloatTypeSuffix?
+    |   ('0'..'9')+ Exponent? FloatTypeSuffix
+	;
+
+CHAR
+    :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
+    ;
+
+STRING
+    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"'
+    ;
+
+MULTILINE_STRING: STRING ((WHITESPACE | ALPHA_NUMERIC)* MULTILINE_STRING)?;
+
+fragment
+IntegerTypeSuffix
+	:	('u'|'U')? ('l'|'L')
+	|	('u'|'U')  ('l'|'L')?
+	;
+
+fragment
+Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+;
+
+fragment
+FloatTypeSuffix : ('f'|'F'|'d'|'D');
+
+
+fragment
+EscapeSequence
+    :   '\\' .
+    |   UnicodeEscape
+    |   OctalEscape
+    ;
+
+fragment
+OctalEscape
+    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7') ('0'..'7')
+    |   '\\' ('0'..'7')
+    ;
+
+fragment
+UnicodeEscape
+    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
+    ;
+
+fragment
+HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+
+COMMENT : '/*' (COMMENT|.)*? '*/'	-> channel(HIDDEN) ;
+LINE_COMMENT : '//' .*? ('\n'|EOF)	-> channel(HIDDEN) ;
+
+WHITESPACE  :   [ \r\t\u000C\n]+ -> skip
+    ;
+
+ELLIPSIS : '...';
+
+
+OTHER : . -> skip ;
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8b5a20c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,17 @@
+# Fuzzy C/C++ Antlr Grammar
+
+Fuzzyc, an island grammar-based fuzzy C/C++ parser, was originally introduced
+in a paper ["Chucky: Exposing Missing Checks in Source Code
+for Vulnerability Discovery"](https://intellisec.de/pubs/2013-ccs.pdf) with
+its source code provided at https://github.com/fabsx00/joern.
+
+Fuzzyc parser is based on an
+[island grammar](https://ieeexplore.ieee.org/document/957806)
+that allows the parser to analyze code without requiring code to be compiled or
+a build environment to be configured.
+
+The code was migrated to a new repository (https://github.com/joernio/joern)
+and integrated with other projects, and this directory pulls only the Fuzzyc
+ANTLR grammar files from the repo.
+
+Note: the Fuzzy C/C++ Antlr grammar files were removed from the original source as of Jun 27, 2022 (https://github.com/joernio/joern/commit/61ed5b010d77b7705bd0e99144fcbc1acaf4d26c).
\ No newline at end of file
diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel
new file mode 100644
index 0000000..1a25216
--- /dev/null
+++ b/WORKSPACE.bazel
@@ -0,0 +1,62 @@
+# Bazel workspace file for Fuzzyc parser.
+
+workspace(name="fuzzyc")
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+http_archive(
+    name = "rules_python",
+    sha256 = "8c15896f6686beb5c631a4459a3aa8392daccaab805ea899c9d14215074b60ef",
+    strip_prefix = "rules_python-0.17.3",
+    url = "https://github.com/bazelbuild/rules_python/archive/refs/tags/0.17.3.tar.gz",
+)
+
+load("@rules_python//python:repositories.bzl", "py_repositories")
+
+py_repositories()
+
+load("@rules_python//python:pip.bzl", "pip_parse")
+
+# Install antlr4-tools to generate C++ Lexor and Parser.
+pip_parse(
+    name = "fuzzyc_deps",
+    requirements_lock = "//:requirements_lock.txt",
+)
+
+load("@fuzzyc_deps//:requirements.bzl", "install_deps")
+install_deps()
+
+# Antlr4 CC Runtime Library.
+http_archive(
+    name = "antlr4_runtimes",
+    build_file_content = """
+package(default_visibility = ["//visibility:public"])
+cc_library(
+    name = "cpp",
+    srcs = glob(["runtime/Cpp/runtime/src/**/*.cpp"]),
+    hdrs = glob(["runtime/Cpp/runtime/src/**/*.h"]),
+    includes = ["runtime/Cpp/runtime/src"],
+)
+    """,
+    sha256 = "50e87636a61daabd424d884c60f804387430920072f585a9fee2b90e2043fdcc",
+    strip_prefix = "antlr4-4.11.1",
+    urls = ["https://github.com/antlr/antlr4/archive/v4.11.1.tar.gz"],
+)
+
+# Google absl
+http_archive(
+    name = "com_google_absl",
+    urls = ["https://github.com/abseil/abseil-cpp/archive/refs/tags/20230125.0.tar.gz"],
+    strip_prefix = "abseil-cpp-20230125.0",
+    sha256 = "3ea49a7d97421b88a8c48a0de16c16048e17725c7ec0f1d3ea2683a2a75adc21",
+)
+
+# GoogleTest
+http_archive(
+    name = "com_google_googletest",
+    urls = ["https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz"],
+    strip_prefix = "googletest-1.13.0",
+    sha256 = "ad7fdba11ea011c1d925b3289cf4af2c66a352e18d4c7264392fead75e919363",
+)
+
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..a711465
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1 @@
+antlr4-tools==0.2
\ No newline at end of file
diff --git a/requirements_lock.txt b/requirements_lock.txt
new file mode 100644
index 0000000..f03b46d
--- /dev/null
+++ b/requirements_lock.txt
@@ -0,0 +1,10 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+#    pip-compile --output-file=requirements_lock.txt requirements.txt
+#
+antlr4-tools==0.2
+    # via -r requirements.txt
+install-jdk==0.3.0
+    # via antlr4-tools
diff --git a/tests/fuzzyc_cc_test.cc b/tests/fuzzyc_cc_test.cc
new file mode 100644
index 0000000..5f5f14f
--- /dev/null
+++ b/tests/fuzzyc_cc_test.cc
@@ -0,0 +1,245 @@
+#include <string>
+#include <fstream>
+#include <streambuf>
+#include <numeric>
+
+#include "absl/status/status.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "antlr4-runtime.h"
+#include "FunctionBaseListener.h"
+#include "FunctionLexer.h"
+#include "FunctionParser.h"
+#include "ModuleBaseListener.h"
+#include "ModuleLexer.h"
+#include "ModuleParser.h"
+
+namespace third_party {
+namespace antlr4_grammars {
+namespace fuzzyc {
+namespace {
+
+using ::antlr4::tree::ParseTreeWalker;
+using ::fuzzyc_cc_function::FunctionBaseListener;
+using ::fuzzyc_cc_function::FunctionLexer;
+using ::fuzzyc_cc_function::FunctionParser;
+using ::fuzzyc_cc_module::ModuleBaseListener;
+using ::fuzzyc_cc_module::ModuleLexer;
+using ::fuzzyc_cc_module::ModuleParser;
+using ::testing::Test;
+
+constexpr char kTestfilePath[] = "tests/testdata";
+
+class FuzzycTest : public Test {
+ protected:
+  void SetUp() override {
+    testfile_str_.open(kTestfilePath);
+  }
+
+  std::ifstream testfile_str_;
+};
+
+class TestModuleListener : public ModuleBaseListener {
+ public:
+  explicit TestModuleListener() {}
+
+  ~TestModuleListener() override {}
+
+  void enterFunction_def(ModuleParser::Function_defContext *ctx) override;
+
+  void enterParameter_name(ModuleParser::Parameter_nameContext *ctx) override;
+
+  void enterCompound_statement(
+      ModuleParser::Compound_statementContext *ctx) override;
+
+  std::vector<std::string> function_names;
+  std::vector<std::string> parameter_names;
+  std::vector<std::string> function_bodies;
+};
+
+void TestModuleListener::enterFunction_def(
+    ModuleParser::Function_defContext *ctx) {
+  function_names.push_back(ctx->function_name()->identifier()->getText());
+}
+
+void TestModuleListener::enterParameter_name(
+    ModuleParser::Parameter_nameContext *ctx) {
+  parameter_names.push_back(ctx->identifier()->getText());
+}
+
+void TestModuleListener::enterCompound_statement(
+    ModuleParser::Compound_statementContext *ctx) {
+  std::string body =
+      ctx->getStart()->getInputStream()->getText(antlr4::misc::Interval(
+          ctx->getStart()->getStartIndex(), ctx->getStop()->getStopIndex()));
+  function_bodies.push_back(body);
+}
+
+class TestFunctionListner : public FunctionBaseListener {
+ public:
+  explicit TestFunctionListner() {}
+
+  ~TestFunctionListner() override {}
+
+  void enterDeclarator(FunctionParser::DeclaratorContext *ctx) override;
+
+  void enterIdentifier(FunctionParser::IdentifierContext *ctx) override;
+
+  void enterType_name(FunctionParser::Type_nameContext *ctx) override;
+
+  std::set<std::string> declarators;
+  std::set<std::string> identifiers;
+  std::set<std::string> types;
+};
+
+void TestFunctionListner::enterDeclarator(
+    FunctionParser::DeclaratorContext *ctx) {
+  declarators.insert(ctx->getText());
+}
+
+void TestFunctionListner::enterIdentifier(
+    FunctionParser::IdentifierContext *ctx) {
+  identifiers.insert(ctx->getText());
+}
+
+void TestFunctionListner::enterType_name(
+    FunctionParser::Type_nameContext *ctx) {
+  types.insert(ctx->getText());
+}
+
+}  // namespace
+
+TEST_F(FuzzycTest, FuzzycModule) {
+  antlr4::ANTLRInputStream input_stream(testfile_str_);
+  ModuleLexer module_lexer(&input_stream);
+  antlr4::CommonTokenStream token_stream(&module_lexer);
+  ModuleParser module_parser(&token_stream);
+  TestModuleListener module_listener;
+  ParseTreeWalker::DEFAULT.walk(&module_listener, module_parser.code());
+
+  // Validate function names extracted by the fuzzy parser
+  const std::vector<std::string> expected_function_names = {
+      "parse_no_kvmapf", "parse_no_stealacc", "kvm_async_pf_task_wait",
+      "paravirt_ops_setup"};
+  EXPECT_THAT(module_listener.function_names, expected_function_names)
+      << "Extracted function names do not match to the expectation";
+
+  // Validate function parameters extracted by the fuzzy parser
+  const std::vector<std::string> expected_parameter_names = {
+      "arg", "arg", "token", "interrupt_kernel"};
+  EXPECT_THAT(module_listener.parameter_names, expected_parameter_names)
+      << "Extracted function names do not match to the expectation";
+
+  // Validate function body extracted by the fuzzy parser
+  const std::string expected_body = "kvmapf = 0;\n        return 0;";
+  std::string found_function_bodies =
+      std::accumulate(module_listener.function_bodies.begin(),
+                      module_listener.function_bodies.end(), std::string());
+  EXPECT_THAT(found_function_bodies, testing::HasSubstr(expected_body))
+      << "Fail to find the expected function body.";
+}
+
+TEST_F(FuzzycTest, FuzzycFunction) {
+  antlr4::ANTLRInputStream input_stream(testfile_str_);
+  ModuleLexer module_lexer(&input_stream);
+  antlr4::CommonTokenStream token_stream(&module_lexer);
+  ModuleParser module_parser(&token_stream);
+  TestModuleListener module_listener;
+  ParseTreeWalker::DEFAULT.walk(&module_listener, module_parser.code());
+
+  // Validate function information of kvm_async_pf_task_wait()
+  {
+    int index = std::find(module_listener.function_names.begin(),
+                          module_listener.function_names.end(),
+                          "kvm_async_pf_task_wait") -
+                module_listener.function_names.begin();
+
+    ASSERT_TRUE(index != module_listener.function_names.size());
+    std::string test_function_body = module_listener.function_bodies.at(index);
+    antlr4::ANTLRInputStream function_input_stream(test_function_body);
+    FunctionLexer function_lexer(&function_input_stream);
+    antlr4::CommonTokenStream function_token_stream(&function_lexer);
+    FunctionParser function_parser(&function_token_stream);
+    TestFunctionListner function_listener;
+    ParseTreeWalker::DEFAULT.walk(&function_listener,
+                                  function_parser.statements());
+
+    std::set<std::string> expected_declarators({"*b", "n", "*e", "key"});
+    EXPECT_THAT(function_listener.declarators, expected_declarators);
+    std::set<std::string> expected_identifiers({"interrupt_kernel",
+                                                "halted",
+                                                "wq",
+                                                "raw_spin_lock",
+                                                "async_pf_sleepers",
+                                                "n",
+                                                "init_swait_queue_head",
+                                                "lock",
+                                                "rcu_irq_exit",
+                                                "finish_swait",
+                                                "current",
+                                                "is_idle_task",
+                                                "rcu_irq_enter",
+                                                "prepare_to_swait_exclusive",
+                                                "schedule",
+                                                "b",
+                                                "hash_32",
+                                                "_find_apf_task",
+                                                "native_safe_halt",
+                                                "preempt_count",
+                                                "hlist_del",
+                                                "cpu",
+                                                "IS_ENABLED",
+                                                "link",
+                                                "local_irq_enable",
+                                                "hlist_add_head",
+                                                "DECLARE_SWAITQUEUE",
+                                                "KVM_TASK_SLEEP_HASHBITS",
+                                                "key",
+                                                "raw_spin_unlock",
+                                                "e",
+                                                "token",
+                                                "kfree",
+                                                "hlist_unhashed",
+                                                "CONFIG_PREEMPT_COUNT",
+                                                "local_irq_disable",
+                                                "list",
+                                                "TASK_UNINTERRUPTIBLE",
+                                                "wait",
+                                                "smp_processor_id",
+                                                "rcu_preempt_depth"});
+    EXPECT_THAT(function_listener.identifiers, expected_identifiers);
+    std::set<std::string> expected_types(
+        {"structkvm_task_sleep_node", "u32", "structkvm_task_sleep_head"});
+    EXPECT_THAT(function_listener.types, expected_types);
+  }
+
+  // Validate function information of paravirt_ops_setup()
+  {
+    int index =
+        std::find(module_listener.function_names.begin(),
+                  module_listener.function_names.end(), "paravirt_ops_setup") -
+        module_listener.function_names.begin();
+
+    ASSERT_TRUE(index != module_listener.function_names.size());
+    std::string test_function_body = module_listener.function_bodies.at(index);
+    antlr4::ANTLRInputStream function_input_stream(test_function_body);
+    FunctionLexer function_lexer(&function_input_stream);
+    antlr4::CommonTokenStream function_token_stream(&function_lexer);
+    FunctionParser function_parser(&function_token_stream);
+    TestFunctionListner function_listener;
+    ParseTreeWalker::DEFAULT.walk(&function_listener,
+                                  function_parser.statements());
+
+    std::set<std::string> expected_identifiers(
+        {"cpu", "pv_ops", "name", "pv_info", "io_delay", "kvm_io_delay",
+         "no_timer_check", "KVM_FEATURE_NOP_IO_DELAY", "kvm_para_has_feature"});
+    EXPECT_THAT(function_listener.identifiers, expected_identifiers);
+  }
+  ASSERT_TRUE(true);
+}
+
+}  // namespace fuzzyc
+}  // namespace antlr4_grammars
+}  // namespace third_party
diff --git a/tests/testdata b/tests/testdata
new file mode 100644
index 0000000..432c610
--- /dev/null
+++ b/tests/testdata
@@ -0,0 +1,123 @@
+Note: This testdata is from Linux kernel arch/x86/kernle/kvm.c with some
+arbitrary modifications for testing the Fuzzyc (including this text).
+
+#include <asm/desc.h>
+#include <asm/tlbflush.h>
+#include <asm/apic.h>
+#include <asm/apicdef.h>
+#include <asm/hypervisor.h>
+#include <asm/tlb.h>
+
+static int kvmapf = 1;
+
+static int __init parse_no_kvmapf(char *arg)
+{
+        kvmapf = 0;
+        return 0;
+}
+
+early_param("no-kvmapf", parse_no_kvmapf);
+
+static int steal_acc = 1;
+static int __init parse_no_stealacc(char *arg)
+{
+        steal_acc = 0;
+        return 0;
+}
+
+early_param("no-steal-acc", parse_no_stealacc);
+
+static DEFINE_PER_CPU_DECRYPTED(struct kvm_vcpu_pv_apf_data, apf_reason) __aligned(64);
+static DEFINE_PER_CPU_DECRYPTED(struct kvm_steal_time, steal_time) __aligned(64);
+static int has_steal_clock = 0;
+
+
+...
+...
+...
+
+
+/*
+ * @interrupt_kernel: Is this called from a routine which interrupts the kernel
+ *                    (other than user space)?
+ */
+void kvm_async_pf_task_wait(u32 token, int interrupt_kernel)
+{
+        u32 key = hash_32(token, KVM_TASK_SLEEP_HASHBITS);
+        struct kvm_task_sleep_head *b = &async_pf_sleepers[key];
+        struct kvm_task_sleep_node n, *e;
+        DECLARE_SWAITQUEUE(wait);
+
+        rcu_irq_enter();
+
+        raw_spin_lock(&b->lock);
+        e = _find_apf_task(b, token);
+        if (e) {
+                /* dummy entry exist -> wake up was delivered ahead of PF */
+                hlist_del(&e->link);
+                kfree(e);
+                raw_spin_unlock(&b->lock);
+
+                rcu_irq_exit();
+                return;
+        }
+
+        n.token = token;
+        n.cpu = smp_processor_id();
+        n.halted = is_idle_task(current) ||
+                   (IS_ENABLED(CONFIG_PREEMPT_COUNT)
+                    ? preempt_count() > 1 || rcu_preempt_depth()
+                    : interrupt_kernel);
+        init_swait_queue_head(&n.wq);
+        hlist_add_head(&n.link, &b->list);
+        raw_spin_unlock(&b->lock);
+
+
+        for (;;) {
+                if (!n.halted)
+                        prepare_to_swait_exclusive(&n.wq, &wait, TASK_UNINTERRUPTIBLE);
+                if (hlist_unhashed(&n.link))
+                        break;
+
+                rcu_irq_exit();
+
+                if (!n.halted) {
+                        local_irq_enable();
+                        schedule();
+                        local_irq_disable();
+                } else {
+                        /*
+                         * We cannot reschedule. So halt.
+                         */
+                        native_safe_halt();
+                        local_irq_disable();
+                }
+
+                rcu_irq_enter();
+        }
+        if (!n.halted)
+                finish_swait(&n.wq, &wait);
+
+        rcu_irq_exit();
+        return;
+}
+EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);
+
+...
+
+
+static void __init paravirt_ops_setup(void)
+{
+        pv_info.name = "KVM";
+
+        if (kvm_para_has_feature(KVM_FEATURE_NOP_IO_DELAY))
+                pv_ops.cpu.io_delay = kvm_io_delay;
+
+#ifdef CONFIG_X86_IO_APIC
+        no_timer_check = 1;
+#endif
+}
+
+...
+
+more code comes but not interested.
\ No newline at end of file
