diff --git a/CMakeLists.txt b/CMakeLists.txt
index f04ce0f291779095b2d996d26d9ef56d52ee500c..9223a9adbae2990565067439a3b46f74581cf9e2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -134,10 +134,11 @@ add_subdirectory(src)
 
 include_directories(src)
 include_directories(src/algebra)
+include_directories(src/language)
 include_directories(src/mesh)
 include_directories(src/output)
-include_directories(src/utils)
 include_directories(src/scheme)
+include_directories(src/utils)
 
 include_directories(src/experimental)
 
@@ -219,5 +220,6 @@ target_link_libraries(
   pastis
   kokkos
   PastisUtils
+  PastisLanguage
   PastisMesh
   PastisExperimental)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fcc3e886e01edf90d0aca9447099d64056d2b91c..1a59893e1c6c3c463fc33fda5bd104b6e1d68861 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -7,6 +7,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
 add_subdirectory(utils)
 include_directories(utils)
 
+# Pastis language
+add_subdirectory(language)
+include_directories(language)
+
 # Pastis algebra
 #add_subdirectory(algebra)
 include_directories(algebra)
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..31b2bb1bc08fc66071514385b52fbddfb3e271ea
--- /dev/null
+++ b/src/language/CMakeLists.txt
@@ -0,0 +1,13 @@
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+# ------------------- Source files --------------------
+
+add_library(
+  PastisLanguage
+  PastisParser.cpp)
+
+#include_directories(${PASTIS_SOURCE_DIR}/utils)
+
+# Additional dependencies
+#add_dependencies(PastisMesh)
diff --git a/src/language/PastisParser.cpp b/src/language/PastisParser.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7be5c4e949e7b305a21dd58e2566093fa559e9b3
--- /dev/null
+++ b/src/language/PastisParser.cpp
@@ -0,0 +1,44 @@
+#include <PastisParser.hpp>
+#include <iostream>
+
+#define TAO_PEGTL_NAMESPACE language
+#include <pegtl.hpp>
+namespace language
+{
+using namespace tao::language;
+
+// clang-format off
+//struct prefix : string< 'H', 'e', 'l', 'l', 'o', ',', ' ' > {};
+struct prefix : TAO_PEGTL_STRING("Hello, ") {};
+struct name : plus< alpha > {};
+struct grammar
+    : must< prefix, name, star< sor< space, digit, string < '+' >, string < '-' >, string < '/' >, string < '*' > > >, one< '!' >, eof >
+{
+};
+// clang-format on
+
+template< typename Rule >
+struct action
+    : nothing< Rule >
+{
+};
+
+template<>
+struct action< name >
+{
+  template< typename Input >
+  static void apply( const Input& in, std::string& v )
+  {
+    v = in.string();
+  }
+};
+}
+
+void parser(const std::string& in_flow) {
+    std::string name;
+    language::string_input in( in_flow , std::string("source_name"));
+    language::parse< language::grammar, language::action >( in, name );
+
+    std::cout << in_flow << " -> ";
+    std::cout << "Good bye, " << name << "!" << std::endl;
+}
diff --git a/src/language/PastisParser.hpp b/src/language/PastisParser.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..0c68127d462b7846f5834baad5fdc7af629667f8
--- /dev/null
+++ b/src/language/PastisParser.hpp
@@ -0,0 +1,8 @@
+#ifndef PASTIS_PARSER_HPP
+#define PASTIS_PARSER_HPP
+
+#include <string>
+
+void parser(const std::string& in_flow);
+
+#endif // PASTIS_PARSER_HPP
diff --git a/src/main.cpp b/src/main.cpp
index f277ce412860ccff5b88c256a2b552a8443e3e73..2bfab31ffd444ee3453c1b6fbc4909943f9e892d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -29,6 +29,7 @@
 #include <MeshNodeBoundary.hpp>
 
 #include <GmshReader.hpp>
+#include <PastisParser.hpp>
 
 #include <CLI/CLI.hpp>
 #include <limits>
@@ -36,6 +37,11 @@
 
 int main(int argc, char *argv[])
 {
+  if (argc == 2) {
+    parser(argv[1]);
+    return 0;
+  }
+
   long unsigned number = 10;
   std::string filename;
   {