diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,31 @@
+# Revision history for ogma-language-c
+
+## [1.0.6] - 2022-11-21
+
+* Version bump 1.0.6 (#64).
+* Update license in cabal file to OtherLicense (#62).
+* Add empty file to keep directory structure in distributable package (#65).
+
+## [1.0.5] - 2022-09-21
+
+* Version bump 1.0.5 (#60).
+
+## [1.0.4] - 2022-07-21
+
+* Version bump 1.0.4 (#53).
+
+## [1.0.3] - 2022-05-21
+
+* Version bump 1.0.3 (#49).
+
+## [1.0.2] - 2022-03-21
+
+* Version bump 1.0.2 (#43).
+
+## [1.0.1] - 2022-01-21
+
+* Version bump 1.0.1 (#39).
+
+## [1.0.0] - 2021-11-22
+
+* Initial release.
diff --git a/LICENSE.pdf b/LICENSE.pdf
new file mode 100644
Binary files /dev/null and b/LICENSE.pdf differ
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,27 @@
+-- | Custom Setup that runs bnfc to generate the language sub-libraries
+-- for the parsers included in Ogma.
+module Main (main) where
+
+import Distribution.Simple         ( defaultMainWithHooks, hookedPrograms,
+                                     postConf, preBuild, simpleUserHooks )
+import Distribution.Simple.Program ( Program (..), findProgramVersion,
+                                     simpleProgram )
+import System.Process              ( system )
+
+-- | Run BNFC on the grammar before the actual build step.
+--
+-- All options for bnfc are hard-coded here. There is an open bug in Cabal's
+-- github repo about supporting BNFC.
+main :: IO ()
+main = defaultMainWithHooks $ simpleUserHooks
+  { hookedPrograms = [ bnfcProgram ]
+  , postConf       = \args flags packageDesc localBuildInfo -> do
+      _ <- system "bnfc --haskell -p Language.C -o src/ grammar/C.cf"
+      postConf simpleUserHooks args flags packageDesc localBuildInfo
+  }
+
+-- | TODO: This should be in Cabal.Distribution.Simple.Program.Builtin.
+bnfcProgram :: Program
+bnfcProgram = (simpleProgram "bnfc")
+  { programFindVersion = findProgramVersion "--version" id
+  }
diff --git a/grammar/C.cf b/grammar/C.cf
new file mode 100644
--- /dev/null
+++ b/grammar/C.cf
@@ -0,0 +1,331 @@
+-- Copyright 2020 United States Government as represented by the Administrator
+-- of the National Aeronautics and Space Administration. All Rights Reserved.
+--
+-- Disclaimers
+--
+-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
+-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
+-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
+-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
+-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
+-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN
+-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
+-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR
+-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,
+-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
+-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES
+-- IT "AS IS."
+--
+-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
+-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
+-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
+-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
+-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
+-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
+-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
+-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY
+-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
+-- AGREEMENT.
+--
+entrypoints TranslationUnit;
+
+token Identifier ( ( letter | '_' ) (letter | digit | '_' )* ) ;
+token IntegerConstant ( ( ["123456789"] digit*)
+                      | ('0' ["01234567"]+)
+                      | ('0' ('x' | 'X') ["01234567"]+)
+                      )
+                      ( ('u' | 'U' | 'l' | 'L')? ) ;
+
+MkTranslationUnit . TranslationUnit ::= [ExternalDeclaration] ;
+
+(:[]) . [ExternalDeclaration] ::= ExternalDeclaration ;
+(:)   . [ExternalDeclaration] ::= ExternalDeclaration [ExternalDeclaration] ;
+
+MkExternalDeclarationFunctionDefinition . ExternalDeclaration ::= FunctionDefinition ;
+MkExternalDeclarationDeclaration        . ExternalDeclaration ::= Declaration ;
+
+MkFunctionDefinition . FunctionDefinition ::= [DeclarationSpecifier] Declarator [Declaration] CompoundStatement ;
+
+MkDeclaration . Declaration ::= DeclarationSpecifiers InitDeclarationListOpt ";" ;
+
+[]  . [Declaration] ::= ;
+(:) . [Declaration] ::= Declaration [Declaration];
+
+[]  . [DeclarationSpecifier] ::= ;
+(:) . [DeclarationSpecifier] ::= DeclarationSpecifier [DeclarationSpecifier] ;
+
+DeclarationSpecifiers . DeclarationSpecifiers ::= DeclarationSpecifier [DeclarationSpecifier] ;
+
+MkDeclarationSpecifierStorageClass  . DeclarationSpecifier ::= StorageClassSpecifier ;
+MkDeclarationSpecifierTypeSpecifier . DeclarationSpecifier ::= TypeSpecifier ;
+MkDeclarationSpecifierTypeQualifier . DeclarationSpecifier ::= TypeQualifier ;
+
+MkStorageClassSpecifierAuto     . StorageClassSpecifier ::= "auto" ;
+MkStorageClassSpecifierRegister . StorageClassSpecifier ::= "register" ;
+MkStorageClassSpecifierStatic   . StorageClassSpecifier ::= "static" ;
+MkStorageClassSpecifierExtern   . StorageClassSpecifier ::= "extern" ;
+MkStorageClassSpecifierTypedef  . StorageClassSpecifier ::= "typedef" ;
+
+MkTypeSpecifierVoid          . TypeSpecifier ::= "void" ;
+MkTypeSpecifierChar          . TypeSpecifier ::= "char" ;
+MkTypeSpecifierShort         . TypeSpecifier ::= "short" ;
+MkTypeSpecifierInt           . TypeSpecifier ::= "int" ;
+MkTypeSpecifierInt8          . TypeSpecifier ::= "int8_t" ;
+MkTypeSpecifierInt16         . TypeSpecifier ::= "int16_t" ;
+MkTypeSpecifierInt32         . TypeSpecifier ::= "int32_t" ;
+MkTypeSpecifierInt64         . TypeSpecifier ::= "int64_t" ;
+MkTypeSpecifierUInt8         . TypeSpecifier ::= "uint8_t" ;
+MkTypeSpecifierUInt16        . TypeSpecifier ::= "uint16_t" ;
+MkTypeSpecifierUInt32        . TypeSpecifier ::= "uint32_t" ;
+MkTypeSpecifierUInt64        . TypeSpecifier ::= "uint64_t" ;
+MkTypeSpecifierLong          . TypeSpecifier ::= "long" ;
+MkTypeSpecifierFloat         . TypeSpecifier ::= "float" ;
+MkTypeSpecifierDouble        . TypeSpecifier ::= "double" ;
+MkTypeSpecifierSigned        . TypeSpecifier ::= "signed" ;
+MkTypeSpecifierUnsigned      . TypeSpecifier ::= "unsigned" ;
+MkTypeSpecifierStructOrUnion . TypeSpecifier ::= StructOrUnionSpecifier ;
+MkTypeSpecifierEnumSpecifier . TypeSpecifier ::= EnumSpecifier ;
+-- MkTypeSpecifierTypedefName   . TypeSpecifier ::= TypedefName ;
+
+MkTypeQualifierConst    . TypeQualifier ::= "const" ;
+MkTypeQualifierVolatile . TypeQualifier ::= "volatile" ;
+
+MkStructOrUnionSpecifierWithFields . StructOrUnionSpecifier ::= StructOrUnion IdentifierOpt "{" [StructDeclaration] "}" ;
+MkStructOrUnionSpecifierEmpty      . StructOrUnionSpecifier ::= StructOrUnion Identifier ;
+
+MkStructOrUnionStruct . StructOrUnion ::= "struct" ;
+MkStructOrUnionUnion  . StructOrUnion ::= "union" ;
+
+(:[]) . [StructDeclaration] ::= StructDeclaration ;
+(:)   . [StructDeclaration] ::= StructDeclaration [StructDeclaration];
+
+MkInitDeclarationListOptNothing . InitDeclarationListOpt ::= ;
+MkInitDeclarationListOptJust    . InitDeclarationListOpt ::= [InitDeclarator] ;
+
+(:[]) . [InitDeclarator] ::= InitDeclarator ;
+(:)   . [InitDeclarator] ::= InitDeclarator "," [InitDeclarator];
+
+MkInitDeclaratorUninitialized . InitDeclarator ::= Declarator ;
+MkInitDeclaratorInitialized   . InitDeclarator ::= Declarator "=" Initializer ;
+
+MkStructDeclaration . StructDeclaration ::= [SpecifierQualifier] [StructDeclarator] ";" ;
+
+(:[]) . [SpecifierQualifier] ::= SpecifierQualifier ;
+(:)   . [SpecifierQualifier] ::= SpecifierQualifier [SpecifierQualifier] ;
+
+MkSpecifierQualifierTypeSpecifier . SpecifierQualifier ::= TypeSpecifier ;
+MkSpecifierQualifierTypeQualifier . SpecifierQualifier ::= TypeQualifier ;
+
+(:[]) . [StructDeclarator] ::= StructDeclarator ;
+(:)   . [StructDeclarator] ::= StructDeclarator "," [StructDeclarator] ;
+
+MkStructDeclaratorDeclarator . StructDeclarator ::= Declarator ;
+MkStructDeclaratorConstant   . StructDeclarator ::= DeclaratorOpt ":" ConstantExpression ;
+
+MkEnumSpecifierWithCases . EnumSpecifier ::= "enum" IdentifierOpt "{" EnumeratorList "}" ;
+MkEnumSpecifierEmpty     . EnumSpecifier ::= "enum" Identifier ;
+
+MkEnumeratorList1 . EnumeratorList ::= Enumerator ;
+MkEnumeratorListN . EnumeratorList ::= EnumeratorList "," Enumerator ;
+
+MkEnumeratorUninitialized . Enumerator ::= Identifier ;
+MkEnumeratorInitialized   . Enumerator ::= Identifier "=" ConstantExpression ;
+
+MkDeclaratorOptNothing . DeclaratorOpt ::= ;
+MkDeclaratorOptJust    . DeclaratorOpt ::= Declarator ;
+
+MkDeclarator . Declarator ::= PointerOpt DirectDeclarator ;
+
+MkDirectDeclaratorIdentifier            . DirectDeclarator ::= Identifier ;
+MkDirectDeclaratorParDeclarator         . DirectDeclarator ::= "(" Declarator ")" ;
+MkDirectDeclaratorConstantExpressionOpt . DirectDeclarator ::= DirectDeclarator "[" ConstantExpressionOpt "]" ;
+MkDirectDeclaratorParameterTypeList     . DirectDeclarator ::= DirectDeclarator "(" ParameterTypeList ")" ;
+MkDirectDeclaratorIdentifierListOpt     . DirectDeclarator ::= DirectDeclarator "(" IdentifierListOpt ")" ;
+
+MkPointerOptNothing . PointerOpt ::= ;
+MkPointerOptJust    . PointerOpt ::= Pointer ;
+
+MkPointer1 . Pointer ::= "*" TypeQualifierListOpt ;
+MkPointerN . Pointer ::= "*" TypeQualifierListOpt Pointer ;
+
+MkTypeQualifierListOptNothing . TypeQualifierListOpt ::= ;
+MkTypeQualifierListOptJust    . TypeQualifierListOpt ::= TypeQualifierList ;
+
+MkTypeQualifierList1 . TypeQualifierList ::= TypeQualifier ;
+MkTypeQualifierListN . TypeQualifierList ::= TypeQualifierList TypeQualifier ;
+
+MkParameterTypeList         . ParameterTypeList ::= ParameterList ;
+MkParameterTypeListEllipsis . ParameterTypeList ::= ParameterList "," "..." ;
+
+MkParameterList1 . ParameterList ::= ParameterDeclaration ;
+MkParameterListN . ParameterList ::= ParameterList "," ParameterDeclaration ;
+
+MkParameterDeclarationDeclarator            . ParameterDeclaration ::= DeclarationSpecifiers Declarator ;
+MkParameterDeclarationAbstractDeclaratorOpt . ParameterDeclaration ::= DeclarationSpecifiers AbstractDeclaratorOpt ;
+
+MkIdentifierListOptNothing . IdentifierListOpt ::= ;
+MkIdentifierListOptJust    . IdentifierListOpt ::= IdentifierList ;
+
+MkIdentifierList1 . IdentifierList ::= Identifier ;
+MkIdentifierListN . IdentifierList ::= IdentifierList "," Identifier ;
+
+MkInitializerAssignment        . Initializer ::= Expression ;
+MkInitializerIniutializerList  . Initializer ::= "{" InitializerList "}" ;
+MkInitializerIniutializerListC . Initializer ::= "{" InitializerList "," "}" ;
+
+MkInitializerList1 . InitializerList ::= Initializer ;
+MkInitializerListN . InitializerList ::= InitializerList "," Initializer ;
+
+MkTypeName . TypeName ::= [SpecifierQualifier] AbstractDeclaratorOpt  ;
+
+MkAbstractDeclaratorOptNothing . AbstractDeclaratorOpt ::= ;
+MkAbstractDeclaratorOptJust    . AbstractDeclaratorOpt ::= AbstractDeclarator ;
+
+MkAbstractDeclaratorPointer . AbstractDeclarator ::= Pointer ;
+MkAbstractDeclaratorDirect  . AbstractDeclarator ::= PointerOpt DirectAbstractDeclarator ;
+
+MkDirectAbstractDeclaratorOptNothing . DirectAbstractDeclaratorOpt ::= ;
+MkDirectAbstractDeclaratorOptJust    . DirectAbstractDeclaratorOpt ::= DirectAbstractDeclarator ;
+
+MkDirectAbstractDeclaratorPar                   . DirectAbstractDeclarator ::= "(" AbstractDeclarator ")" ;
+MkDirectAbstractDeclaratorConstantExpressionOpt . DirectAbstractDeclarator ::= DirectAbstractDeclaratorOpt "[" ConstantExpressionOpt "]" ;
+MkDirectAbstractDeclaratorParameterTypeList     . DirectAbstractDeclarator ::= DirectAbstractDeclaratorOpt "(" ParameterTypeList ")" ;
+
+-- MkTypedefName . TypedefName ::= Identifier ;
+
+MkStatementLabeled    . Statement ::= LabeledStatement ;
+MkStatementExpression . Statement ::= ExpressionStatement ;
+MkStatementCompound   . Statement ::= CompoundStatement ;
+MkStatementSelection  . Statement ::= SelectionStatement ;
+MkStatementIteration  . Statement ::= IterationStatement ;
+MkStatementJump       . Statement ::= JumpStatement ;
+
+MkLabeledStatementIdentifier . LabeledStatement ::= Identifier ":" Statement ;
+MkLabeledStatementCase       . LabeledStatement ::= "case" ConstantExpression ":" Statement ;
+MkLabeledStatementDefault    . LabeledStatement ::= "default" ":" Statement ;
+
+MkExpressionStatement . ExpressionStatement ::= ExpressionOpt ";" ;
+
+MkCompoundStatement . CompoundStatement ::= "{" [Declaration] [Statement] "}" ;
+
+[]  . [Statement] ::=  ;
+(:) . [Statement] ::= Statement [Statement] ;
+
+MkSelectionStatementIfThen     . SelectionStatement ::= "if" "(" Expression ")" Statement ;
+MkSelectionStatementIfThenElse . SelectionStatement ::= "if" "(" Expression ")" Statement "else" Statement ;
+MkSelectionStatementSwitch     . SelectionStatement ::= "switch" "(" Expression ")" Statement ;
+
+MkIterationStatementWhile . IterationStatement ::= "while" "(" Expression ")" Statement ;
+MkIterationStatementDo    . IterationStatement ::= "do" Statement "while" "(" Expression ")" ";" ;
+MkIterationStatementFor   . IterationStatement ::= "for" "(" ExpressionOpt ";" ExpressionOpt ";" ExpressionOpt ")" Statement ;
+
+MkJumpStatementGoto     . JumpStatement ::= "goto" Identifier ";" ;
+MkJumpStatementContinue . JumpStatement ::= "continue" ";" ;
+MkJumpStatementBreak    . JumpStatement ::= "break" ";" ;
+MkJumpStatementReturn   . JumpStatement ::= "return" ExpressionOpt ";" ;
+
+MkExpressionOptNothing . ExpressionOpt ::= ;
+MkExpressionOptJust    . ExpressionOpt ::= Expression ;
+
+coercions Expression 12 ;
+Expression12 . Expression12 ::= CastExpression ;
+Expression11 . Expression11 ::= Expression11 MultOp Expression12 ;
+Expression10 . Expression10 ::= Expression10 AddOp Expression11 ;
+Expression9  . Expression9  ::= Expression9 ShiftOp Expression10 ;
+Expression8  . Expression8  ::= Expression8 RelOp Expression9 ;
+Expression7  . Expression7  ::= Expression7 EqOp Expression8 ;
+Expression6  . Expression6  ::= Expression6 "^" Expression7 ;
+Expression5  . Expression5  ::= Expression5 "|" Expression6 ;
+Expression4  . Expression4  ::= Expression4 "&&" Expression5 ;
+Expression3  . Expression3  ::= Expression3 "||" Expression4 ;
+Expression2  . Expression2  ::= Expression3 "?" Expression ":" Expression2 ;
+Expression1  . Expression1  ::= UnaryExpression AssignmentOperator Expression2 ;
+Expression   . Expression   ::= Expression "," Expression1;
+
+(:[]) . [Expression1] ::= Expression1 ;
+(:)   . [Expression1] ::= Expression1 "," [Expression1] ;
+
+MkAssignmentOperatorAssign . AssignmentOperator ::= "=" ;
+MkAssignmentOperatorTimes  . AssignmentOperator ::= "*=" ;
+MkAssignmentOperatorDiv    . AssignmentOperator ::= "/=" ;
+MkAssignmentOperatorMod    . AssignmentOperator ::= "%=" ;
+MkAssignmentOperatorPlus   . AssignmentOperator ::= "+=" ;
+MkAssignmentOperatorMinus  . AssignmentOperator ::= "-=" ;
+MkAssignmentOperatorShiftL . AssignmentOperator ::= "<<=" ;
+MkAssignmentOperatorShiftR . AssignmentOperator ::= ">>=" ;
+MkAssignmentOperatorAnd    . AssignmentOperator ::= "&=" ;
+MkAssignmentOperatorXOr    . AssignmentOperator ::= "^=" ;
+MkAssignmentOperatorOr     . AssignmentOperator ::= "|=" ;
+
+MkConditionalExpressionNothing . ConstantExpressionOpt ::= ;
+MkConditionalExpressionJust    . ConstantExpressionOpt ::= ConstantExpression ;
+
+-- Should be Expression2
+MkConstantExpression . ConstantExpression ::= Expression2 ;
+
+EqOpEq  . EqOp ::= "==" ;
+EqOpNeq . EqOp ::= "!=" ;
+
+RelOpLT . RelOp ::= "<" ;
+RelOpGT . RelOp ::= ">" ;
+RelOpLE . RelOp ::= "<=" ;
+RelOpGE . RelOp ::= ">=" ;
+
+ShiftOpLeft  . ShiftOp ::= "<<" ;
+ShiftOpRight . ShiftOp ::= ">>" ;
+
+AddOpPlus  . AddOp ::= "+" ;
+AddOpMinus . AddOp ::= "-" ;
+
+MultOpTimes . MultOp ::= "*" ;
+MultOpDiv   . MultOp ::= "/" ;
+MultOpMod   . MultOp ::= "%" ;
+
+MkCastExpression1 . CastExpression ::= UnaryExpression ;
+MkCastExpressionN . CastExpression ::= "(" TypeName ")" CastExpression ;
+
+MkUnaryExpressionPostfix   . UnaryExpression ::= PostfixExpression ;
+MkUnaryExpressionPlus2     . UnaryExpression ::= "++" UnaryExpression ;
+MkUnaryExpressionMinus2    . UnaryExpression ::= "--" UnaryExpression ;
+MkUnaryExpressionUnaryOp   . UnaryExpression ::= UnaryOperator CastExpression ;
+MkUnaryExpressionSizeof1   . UnaryExpression ::= "sizeof" UnaryExpression ;
+MkUnaryExpressionSizeofPar . UnaryExpression ::= "sizeof" "(" TypeName ")" ;
+
+MkUnaryOperatorAnd   . UnaryOperator ::= "&" ;
+MkUnaryOperatorTimes . UnaryOperator ::= "*" ;
+MkUnaryOperatorPlus  . UnaryOperator ::= "+" ;
+MkUnaryOperatorMinus . UnaryOperator ::= "-" ;
+MkUnaryOperatorTilde . UnaryOperator ::= "~" ;
+MkUnaryOperatorBang  . UnaryOperator ::= "!" ;
+
+MkPostfixExpression1                         . PostfixExpression ::= PrimaryExpression ;
+MkPostfixExpressionBrackets                  . PostfixExpression ::= PostfixExpression "[" Expression "]" ;
+MkPostfixExpressionArgumentExpressionListOpt . PostfixExpression ::= PostfixExpression "(" ArgumentExpressionListOpt ")" ;
+MkPostfixExpressionDot                       . PostfixExpression ::= PostfixExpression "." Identifier ;
+MkPostfixExpressionArrow                     . PostfixExpression ::= PostfixExpression "->" Identifier ;
+MkPostfixExpressionPlus2                     . PostfixExpression ::= PostfixExpression "++" ;
+MkPostfixExpressionMinus2                    . PostfixExpression ::= PostfixExpression "--" ;
+
+MkPrimaryExpressionIdentifier    . PrimaryExpression ::= Identifier ;
+MkPrimaryExpressionConstant      . PrimaryExpression ::= Constant ;
+MkPrimaryExpressionString        . PrimaryExpression ::= String ;
+MkPrimaryExpressionParExpression . PrimaryExpression ::= "(" Expression ")" ;
+
+MkArgumentExpressionListOptNothing . ArgumentExpressionListOpt ::= ;
+MkArgumentExpressionListOptJust    . ArgumentExpressionListOpt ::= [Expression1] ;
+
+MkConstantInteger   . Constant ::= IntegerConstant ;
+MkConstantCharacter . Constant ::= CharacterConstant ;
+MkConstantFloating  . Constant ::= FloatingConstant ;
+-- MkConstantEnumeration . Constant ::= EnumerationConstant ;
+
+MkIdentifierOptNothing . IdentifierOpt ::= ;
+MkIdentifierOptJust    . IdentifierOpt ::= Identifier ;
+
+MkCharacterConstant . CharacterConstant ::= Char ;
+MkFloatingConstant . FloatingConstant ::= Double ;
+
+comment "/*" "*/" ;
+comment "//" ;
+comment "#" ;
diff --git a/ogma-language-c.cabal b/ogma-language-c.cabal
new file mode 100644
--- /dev/null
+++ b/ogma-language-c.cabal
@@ -0,0 +1,111 @@
+-- Copyright 2020 United States Government as represented by the Administrator
+-- of the National Aeronautics and Space Administration. All Rights Reserved.
+--
+-- Disclaimers
+--
+-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
+-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
+-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
+-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
+-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
+-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN
+-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
+-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR
+-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,
+-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
+-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES
+-- IT "AS IS." 
+--
+-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
+-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
+-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
+-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
+-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
+-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
+-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
+-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY
+-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
+-- AGREEMENT.
+
+cabal-version:       2.0
+build-type:          Custom
+
+name:                ogma-language-c
+version:             1.0.6
+homepage:            http://nasa.gov
+license:             OtherLicense
+license-file:        LICENSE.pdf
+author:              Ivan Perez, Alwyn Goodloe
+maintainer:          ivan.perezdominguez@nasa.gov
+category:            Aerospace
+extra-source-files:  CHANGELOG.md
+                     grammar/C.cf
+                     src/.keep
+                     tests/reduced_geofence_msgs.h
+                     tests/reduced_geofence_msgs_bad.h
+
+synopsis:            Ogma: Runtime Monitor translator: C Language Frontend
+
+description:         Ogma is a tool to facilitate the integration of safe runtime monitors into
+                     other systems. Ogma extends
+                     <https://github.com/Copilot-Language/copilot Copilot>, a high-level runtime
+                     verification framework that generates hard real-time C99 code.
+                     .
+                     This library contains a frontend to read C header files.
+
+custom-setup
+  setup-depends:
+      base    >= 4.11.0.0
+    , Cabal   >= 2.0
+    , process
+    , BNFC    >= 2.9.1
+
+library
+
+  exposed-modules:
+    -- Automatically generated
+    Language.C.AbsC
+    Language.C.LexC
+    Language.C.ParC
+    Language.C.PrintC
+
+  autogen-modules:
+    Language.C.AbsC
+    Language.C.LexC
+    Language.C.ParC
+    Language.C.PrintC
+
+  build-depends:
+      base  >= 4.11.0.0 && < 5
+    , array >= 0.5.2.0
+
+  hs-source-dirs:
+    src
+
+  default-language:
+    Haskell2010
+
+test-suite unit-tests
+  type:
+    exitcode-stdio-1.0
+
+  main-is:
+    Main.hs
+
+  build-depends:
+      base                       >= 4.11.0.0 && < 5
+    , QuickCheck
+    , test-framework
+    , test-framework-quickcheck2
+
+    , ogma-language-c
+
+  hs-source-dirs:
+    tests
+
+  default-language:
+    Haskell2010
+
+  ghc-options:
+    -Wall
diff --git a/src/.keep b/src/.keep
new file mode 100644
--- /dev/null
+++ b/src/.keep
diff --git a/tests/Main.hs b/tests/Main.hs
new file mode 100644
--- /dev/null
+++ b/tests/Main.hs
@@ -0,0 +1,68 @@
+-- Copyright 2020 United States Government as represented by the Administrator
+-- of the National Aeronautics and Space Administration. All Rights Reserved.
+--
+-- Disclaimers
+--
+-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
+-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
+-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
+-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
+-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
+-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN
+-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
+-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR
+-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,
+-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
+-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES
+-- IT "AS IS." 
+--
+-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
+-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
+-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
+-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
+-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
+-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
+-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
+-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY
+-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
+-- AGREEMENT.
+--
+-- | Test C language library.
+module Main where
+
+-- External imports
+import Data.Either                          ( isLeft, isRight )
+import Test.Framework                       ( Test, defaultMainWithOpts )
+import Test.Framework.Providers.QuickCheck2 ( testProperty )
+import Test.QuickCheck                      ( Property )
+import Test.QuickCheck.Monadic              ( assert, monadicIO, run )
+
+-- Internal imports
+import qualified Language.C.ParC as C ( myLexer, pTranslationUnit )
+
+-- | Run all unit tests for the C parser.
+main :: IO ()
+main =
+  defaultMainWithOpts tests mempty
+
+-- | All unit tests for the C parser.
+tests :: [Test.Framework.Test]
+tests =
+  [ testProperty "Parse C (correct header case)"   propParseCOk
+  , testProperty "Parse C (incorrect header case)" propParseCFail
+  ]
+
+-- | Test the C parser on a well-formed header file.
+propParseCOk :: Property
+propParseCOk = monadicIO $ do
+  content <- run $ readFile "tests/reduced_geofence_msgs.h"
+  let program = C.pTranslationUnit $ C.myLexer content
+  assert (isRight program)
+
+-- | Test the C parser on an incorrect header file.
+propParseCFail :: Property
+propParseCFail = monadicIO $ do
+  content <- run $ readFile "tests/reduced_geofence_msgs_bad.h"
+  let program = C.pTranslationUnit $ C.myLexer content
+  assert (isLeft program)
diff --git a/tests/reduced_geofence_msgs.h b/tests/reduced_geofence_msgs.h
new file mode 100644
--- /dev/null
+++ b/tests/reduced_geofence_msgs.h
@@ -0,0 +1,12 @@
+/**
+ * @struct geofence_parameters_t
+ * @brief data structure containing information about the parameters used by the geofence app
+ */
+typedef struct{
+   uint8_t  TlmHeader[CFE_SB_TLM_HDR_SIZE];
+   double lookahead;
+   double hthreshold;
+   double vthreshold;
+   double hstepback;
+   double vstepback;
+}geofence_parameters_t;
diff --git a/tests/reduced_geofence_msgs_bad.h b/tests/reduced_geofence_msgs_bad.h
new file mode 100644
--- /dev/null
+++ b/tests/reduced_geofence_msgs_bad.h
@@ -0,0 +1,12 @@
+/**
+ * @struct geofence_parameters_t
+ * @brief data structure containing information about the parameters used by the geofence app
+ */
+typeduuuef struct{
+   uint8_t  TlmHeader[CFE_SB_TLM_HDR_SIZE];
+   double lookahead;
+   double hthreshold;
+   double vthreshold;
+   double hstepback;
+   double vstepback;
+}geofence_parameters_t;
