diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index 87f0574a64d173a62c11f5ecc52f905f8dbb410b..628410a35b2dcbf92ef467a5757ccf81049d8078 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -86,6 +86,7 @@ header {
 	#include <libwccl/ops/match/conditions/conjconditions.h>
 	#include <libwccl/ops/match/conditions/tokencondition.h>
 	#include <libwccl/ops/match/conditions/oneof.h>
+	#include <libwccl/ops/match/conditions/longest.h>
 	#include <libwccl/ops/match/actions/markmatch.h>
 	#include <libwccl/ops/match/actions/unmarkmatch.h>
 	#include <libwccl/ops/functions/match/submatch.h>
@@ -2023,6 +2024,8 @@ match_cond_all
 	: ret = match_cond_optional [tagset, vars]
 	| ret = match_cond_repeate  [tagset, vars]
 	| ret = match_cond_token    [tagset, vars]
+	| ret = match_cond_oneof    [tagset, vars]
+	| ret = match_cond_longest  [tagset, vars]
 	| ret = match_cond_is
 	| ret = match_cond_text
 ;
@@ -2098,6 +2101,19 @@ match_cond_oneof
 	}
 ;
 
+// Match condition - longest(variant1(v1), variant(v2), ...)
+// Returns boost::shared_ptr<Longest>
+match_cond_longest
+	[const Corpus2::Tagset& tagset, Variables& vars]
+	returns [boost::shared_ptr<Longest> lng]
+{
+	boost::shared_ptr<std::vector<ConjConditions> > variants;
+}
+	: "longest" LPAREN variants = match_variants [tagset, vars] RPAREN {
+		lng.reset(new Longest(variants));
+	}
+;
+
 // ----------------------------------------------------------------------------
 
 // Match actions. Match action can be mark or unmark