From d1763769820620248a904d20c8e01f0a74d3ad7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20K=C4=99dzia?= <pawel.kedzia@pwr.wroc.pl>
Date: Mon, 22 Nov 2010 14:16:24 +0100
Subject: [PATCH] Fixed grammar (in/equal/inter)

---
 libwccl/parser/grammar.g | 112 ++++++++++++++++++++++++++++++++-------
 1 file changed, 93 insertions(+), 19 deletions(-)

diff --git a/libwccl/parser/grammar.g b/libwccl/parser/grammar.g
index bb2dac0..157129f 100644
--- a/libwccl/parser/grammar.g
+++ b/libwccl/parser/grammar.g
@@ -38,6 +38,8 @@ header {
 	#include <libwccl/ops/isinside.h>
 	#include <libwccl/ops/isoutside.h>
 
+	#include <libwccl/ops/conditional.h>
+
 	// Unicode String
 	#include <unicode/uniset.h>
 	#include <unicode/unistr.h>
@@ -77,9 +79,9 @@ private:
 }
 
 // TODO
-//  - jak utworzyc TSet (dodac element do TSet)
-//  - nie mozna utworzy Const::Value i na tym robic specjalizowany reset?
 //  - base, orth
+//  - po dodaniu reguly condit_sym jest niejednoznacznosc w in/inter/equal!!
+//  - equal do bool
 
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
@@ -441,6 +443,7 @@ sym_set_operators
 	[Wccl::Variables& vars]
 	returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > ret]
 	: ret = op_sym_set [vars] 
+	| ret = condit_sym [vars]
 ;
 // Implementations of symbol set operators:
 // ----------------------------------------------------------------------------
@@ -451,6 +454,28 @@ op_sym_set
 	| op = sym_set_value
 ;
 
+// ----------------------------------------------------------------------------
+// if (Bool, TSet, TSet)
+// ? TSet ? Bool : {}
+condit_sym
+	[Wccl::Variables& vars]
+	returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > op]
+{
+	boost::shared_ptr<Wccl::Function<Wccl::Bool> > test;
+	boost::shared_ptr<Wccl::Function<Wccl::TSet> > p_true, p_false;
+}
+	: "if" LPAREN test  = logical_predicates [vars] COMMA 
+							p_true  = sym_set_operators  [vars] COMMA 
+							p_false = sym_set_operators  [vars] {
+		op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true, p_false));
+	}
+/*
+	| Q_MARK p_true = sym_set_operators  [vars] 
+		Q_MARK test   = logical_predicates [vars] {
+		op.reset(new Wccl::Conditional<Wccl::TSet>(test, p_true));
+	}
+*/
+;
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // Position operators 
@@ -484,6 +509,7 @@ string_operators
 	| ret = op_upper   [vars]
 	| ret = op_affix   [vars] 
 	| ret = op_str_set [vars] 
+	| ret = condit_str [vars]
 ;
 // Implementations of string operators:
 // ----------------------------------------------------------------------------
@@ -548,6 +574,28 @@ op_str_set
 	: op = str_set_variable [vars]
 	| op = str_set_value 
 ;
+// ----------------------------------------------------------------------------
+// if (Bool, StrSet, StrSet)
+// ? StrSet ? Bool : []
+condit_str
+	[Wccl::Variables& vars]
+	returns [boost::shared_ptr<Wccl::Function<Wccl::StrSet> > op]
+{
+	boost::shared_ptr<Wccl::Function<Wccl::Bool> > test;
+	boost::shared_ptr<Wccl::Function<Wccl::StrSet> > p_true, p_false;
+}
+	: "if" LPAREN test  = logical_predicates [vars] COMMA 
+							p_true  = string_operators   [vars] COMMA 
+							p_false = string_operators   [vars] {
+		op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true, p_false));
+	}
+/*
+	| Q_MARK p_true = string_operators   [vars] 
+		Q_MARK test   = logical_predicates [vars] {
+		op.reset(new Wccl::Conditional<Wccl::StrSet>(test, p_true));
+	}
+*/
+;
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
@@ -567,6 +615,7 @@ logical_predicates
 	| ret = lpred_regex [vars]
 	| ret = setvar_op   [vars]
 	| ret = lpred_inout [vars]
+	| ret = condit_bool [vars]
 ;
 // ----------------------------------------------------------------------------
 // comma-separated predicates
@@ -647,11 +696,11 @@ lpred_in
 	              ss2 = string_operators [vars] RPAREN {
 		op.reset(new Wccl::IsSubsetOf<Wccl::StrSet>(ss1, ss2));
 	}
+/*
 	| "in" LPAREN ts1 = sym_set_operators [vars] COMMA
 	              ts2 = sym_set_operators [vars] RPAREN {
 		op.reset(new Wccl::IsSubsetOf<Wccl::TSet>(ts1, ts2));
 	}
-/*
 	| "in" LPAREN p1 = position_operators [vars] COMMA 
 	              p2 = position_operators [vars] RPAREN {
 		// op.reset(new Wccl::IsSubsetOf(*p1.get(), *p2.get()));
@@ -666,23 +715,21 @@ lpred_inter
 {
 	boost::shared_ptr<Wccl::Function<Wccl::StrSet> >   ss1, ss2;
 	boost::shared_ptr<Wccl::Function<Wccl::TSet> >     ts1, ts2;
-	boost::shared_ptr<Wccl::Function<Wccl::Position> > p1,  p2;
-
 }
-	: "inter" LPAREN ss1 = string_operators [vars] COMMA 
-	                 ss2 = string_operators [vars] RPAREN {
-		op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2));
-	}
-	| "inter" LPAREN ts1 = sym_set_operators [vars] COMMA
-	                 ts2 = sym_set_operators [vars] RPAREN {
-		op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2));
-	}
-/*
-	| "inter" LPAREN p1 = position_operators [vars] COMMA 
-	                 p2 = position_operators [vars] RPAREN {
-		// op.reset(new Wccl::Intersects(*p1.get(), *p2.get()));
+	: "inter" LPAREN (
+			(ss1 = string_operators  [vars] COMMA  ss2 = string_operators [vars] RPAREN)
+			(ts1 = sym_set_operators [vars] COMMA  ts2 = sym_set_operators [vars] RPAREN) |
+	) {
+		if (ss1) {
+			op.reset(new Wccl::Intersects<Wccl::StrSet>(ss1, ss2));
+		}
+		else if (ts1) {
+			op.reset(new Wccl::Intersects<Wccl::TSet>(ts1, ts2));
+		}
+		else {
+			assert(false);
+		}
 	}
-*/
 ;
 
 // ----------------------------------------------------------------------------
@@ -698,11 +745,11 @@ lpred_eq
 	                 ss2 = string_operators [vars] RPAREN {
 		op.reset(new Wccl::Equals<Wccl::StrSet>(ss1, ss2));
 	}
+/*
 	| "equal" LPAREN ts1 = sym_set_operators [vars] COMMA
 	                 ts2 = sym_set_operators [vars] RPAREN {
 		op.reset(new Wccl::Equals<Wccl::TSet>(ts1, ts2));
 	}
-/*
 	| "equal" LPAREN p1 = position_operators [vars] COMMA 
 	                 p2 = position_operators [vars] RPAREN {
 		op.reset(new Wccl::Equals<Wccl::Position>(p1, p2));
@@ -737,6 +784,26 @@ lpred_inout
 	}
 ;
 
+// ----------------------------------------------------------------------------
+// if (Bool, Bool, Bool)
+// ? Bool ? Bool : False
+condit_bool
+	[Wccl::Variables& vars]
+	returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
+{
+	boost::shared_ptr<Wccl::Function<Wccl::Bool> > test, p_true, p_false;
+}
+	: "if" LPAREN test  = logical_predicates [vars] COMMA 
+							p_true  = logical_predicates [vars] COMMA 
+							p_false = logical_predicates [vars] {
+		op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true, p_false));
+	}
+	| Q_MARK p_true = logical_predicates [vars] 
+		Q_MARK test   = logical_predicates [vars] {
+		op.reset(new Wccl::Conditional<Wccl::Bool>(test, p_true));
+	}
+;
+
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 // ANTLR LEXER
@@ -821,6 +888,13 @@ options {
 	: "b:"
 ;
 
+POS_PREFIX
+options {
+	paraphrase = "Bool prefix";
+}
+	: "p:"
+;
+
 LBRACKET 
 options {
 	paraphrase = "'['";
-- 
GitLab