diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index 53df7907d181bd8c6c1fd95fecf4ea4e47a28e24..ed4ad958ed7ed08944498b5199c15515b6d8c77a 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -1944,7 +1944,23 @@ match_action
 match_mark_action
 	[const Corpus2::Tagset& tagset, Variables& vars]
 	returns [boost::shared_ptr<MarkMatch> m_act]
-	: "mark" LPAREN /* TODO */ RPAREN
+{
+	boost::shared_ptr<Function<Match> > match_to;
+	boost::shared_ptr<Function<Match> > match_from;
+}
+	: "mark" LPAREN 
+			match_from = match_fit[tagset, vars] COMMA
+			match_to   = match_fit[tagset, vars] COMMA
+			annotation_name : STRING
+		RPAREN {
+			m_act.reset(
+				new MarkMatch(
+					match_from, 
+					match_to, 
+					((antlr::Token*)annotation_name)->getText()
+				)
+			);
+		}
 ;
 
 // Match unmark action
@@ -1977,6 +1993,18 @@ match_action_comma_sep
 	)*
 ;
 
+// Function<Match> is wrapper for Constant<Match> and Function<Match>
+// Returns boost::shared_ptr<Function<Match> >
+match_fit
+  [const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<Function<Match> > ret]
+{
+	//
+}
+	: ret = match_vector_variable [vars]
+	| ret = match_value_const
+;
+
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 // ANTLR LEXER