Skip to content
Snippets Groups Projects
Commit 57440040 authored by Paweł Kędzia's avatar Paweł Kędzia
Browse files

Modified grammar for new langauage structures.

parent 02427176
Branches
No related merge requests found
......@@ -50,7 +50,7 @@ options {
// ----------------------------------------------------------------------------
class ANTLRParser extends Parser;
options {
k = 6;
k = 4;
exportVocab = ANTLRExpr;
buildAST = false;
defaultErrorHandler = false;
......@@ -77,9 +77,6 @@ private:
// - nie mozna utworzy Const::Value i na tym robic specjalizowany reset?
// - base, orth
// Bylo boolean_v TRUE_VALUE. FALSE_VALE, a jest "True", "False" - bylo z
// regula lexera, a teraz jest wstawione na "sztywno" do gramatyki
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// "GLOBAL" RULES
......@@ -108,23 +105,11 @@ parse_predicates
res.reset(new ANTLRParserResult<Wccl::Bool>());
boost::shared_ptr<Wccl::Function<Wccl::Bool> > op;
}
: op = predicates [*res->variables.get()] {
: op = logical_predicates [*res->variables.get()] {
res->op = op;
}
;
// ----------------------------------------------------------------------------
// Rules for parsing values in scope (variables).
// Returns boost::shared_ptr<Wccl::Function<Wccl::Value> >
/*
parse_values
returns [boost::shared_ptr<Wccl::Function<Wccl::Value> > res]
{
Wccl::Variables vars;
}
: res = values [vars]
;
*/
// ----------------------------------------------------------------------------
// Rules for parsing tagset (symbol set) operators
// Returns boost::shared_ptr<Wccl::Function<Wccl::TSet> >
......@@ -138,26 +123,7 @@ parse_sym_set_operator
res->op = op;
}
;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// All values:
// Values can be use for setvar(...,..)
// ----------------------------------------------------------------------------
/*
values
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Value> > res]
{
boost::shared_ptr<Wccl::Constant<Wccl::StrSet> > r_StrSet;
boost::shared_ptr<Wccl::Constant<Wccl::TSet> > r_TSet;
boost::shared_ptr<Wccl::Constant<Wccl::Bool> > r_Bool;
boost::shared_ptr<Wccl::Constant<Wccl::Position> > r_Pos;
}
: r_Pos = position [vars] // TODO { res = r_Pos; }
| r_TSet = sym_set [vars]
| r_Bool = boolean [vars]
;
*/
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// VALUES
......@@ -165,18 +131,18 @@ values
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// Single or muliple values in string set
str_set_v_in
str_set_value_in
[boost::shared_ptr<Wccl::StrSet>& s_set]
: v1: STRING {
s_set->insert(token_ref_to_ustring(v1));
}
| v2: STRING COMMA str_set_v_in [s_set] {
| v2: STRING COMMA str_set_value_in [s_set] {
s_set->insert(token_ref_to_ustring(v2));
}
;
// string set, called as unnamed (temporary) StrSet:
// calls: [] ['a'] ['a', 'b'] ["a"] ["a", "b"] ['a', "b"] or variable $A
str_set_v
str_set_value
returns [boost::shared_ptr<Wccl::Constant<Wccl::StrSet> > val]
{
boost::shared_ptr<Wccl::StrSet> set(new Wccl::StrSet);
......@@ -184,7 +150,7 @@ str_set_v
: LBRACKET RBRACKET {
val.reset(new Wccl::Constant<Wccl::StrSet>(*set.get()));
}
| LBRACKET str_set_v_in [set] RBRACKET {
| LBRACKET str_set_value_in [set] RBRACKET {
val.reset(new Wccl::Constant<Wccl::StrSet>(*set.get()));
}
;
......@@ -208,12 +174,12 @@ sym_set_elem
;
// sym set in
sym_set_in
sym_set_value_in
[boost::shared_ptr<Wccl::TSet> &set]
: sym_set_elem [set]
;
// sym set {} {a} {a, b}
sym_set_v
sym_set_value
returns [boost::shared_ptr<Wccl::Constant<Wccl::TSet> > val]
{
boost::shared_ptr<Wccl::TSet> set(new Wccl::TSet);
......@@ -221,20 +187,20 @@ sym_set_v
: LCURLY RCURLY {
val.reset(new Wccl::Constant<Wccl::TSet>(*set.get()));
}
| LCURLY sym_set_in [set] RCURLY {
| LCURLY sym_set_value_in [set] RCURLY {
val.reset(new Wccl::Constant<Wccl::TSet>(*set.get()));
}
;
// ----------------------------------------------------------------------------
// boolean value:
boolean_v
boolean_value
returns [boost::shared_ptr<Wccl::Constant<Wccl::Bool> > val]
: TRUE_VALUE { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(true ))); }
| FALSE_VALUE { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(false))); }
: "True" { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(true ))); }
| "False" { val.reset(new Wccl::Constant<Wccl::Bool>(Wccl::Bool(false))); }
;
// ----------------------------------------------------------------------------
// position value:
position_v
position_value
returns [boost::shared_ptr<Wccl::Constant<Wccl::Position> > val]
: i: INT {
val.reset(
......@@ -271,10 +237,10 @@ position_v
///////////////////////////////////////////////////////////////////////////////
// Position: $name
// ----------------------------------------------------------------------------
position
position_variable
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > op]
: DOLLAR n: VAR_NAME {
: DOLLAR n: SYMBOL {
vars.get_put<Wccl::Position>(token_ref_to_std_string(n));
Wccl::VariableAccesor<Wccl::Position> acc =
......@@ -286,9 +252,9 @@ position
// ----------------------------------------------------------------------------
// Position reference: $(0-9)+name
// !! Cannot use for setvar(...,...) !!
position_ref
position_ref_variable
[Wccl::Variables& vars]
: DOLLAR p_ref: INT n: VAR_NAME {
: DOLLAR p_ref: INT n: SYMBOL {
// TODO
}
;
......@@ -296,13 +262,13 @@ position_ref
// String set, call examples: $name, $sName, $s_name, $s_Name etc.
// This expression gets variable of tyme StrSet from string-named variable
// Returns Wccl::VarGetter<Wccl::StrSet> from Set-variables
str_set
str_set_variable
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > op]
: DOLLAR STR_PREFIX n: VAR_NAME {
: DOLLAR STR_PREFIX n: SYMBOL {
// get/put variable to variables
vars.get_put<Wccl::StrSet>(token_ref_to_std_string(n));
// makes accesor for value
Wccl::VariableAccesor<Wccl::StrSet> acc =
vars.create_accesor<Wccl::StrSet>(token_ref_to_std_string(n));
......@@ -312,10 +278,10 @@ str_set
;
// ----------------------------------------------------------------------------
// Symbol set: $tName
sym_set
sym_set_variable
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > op]
: DOLLAR TST_PREFIX n: VAR_NAME {
: DOLLAR TST_PREFIX n: SYMBOL {
vars.get_put<Wccl::TSet>(token_ref_to_std_string(n));
Wccl::VariableAccesor<Wccl::TSet> acc =
......@@ -326,10 +292,10 @@ sym_set
;
// ----------------------------------------------------------------------------
// Bool: $bName
boolean
boolean_variable
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
: DOLLAR BOOL_PREFIX n: VAR_NAME {
returns [boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > op]
: DOLLAR BOOL_PREFIX n: SYMBOL {
vars.get_put<Wccl::Bool>(token_ref_to_std_string(n));
Wccl::VariableAccesor<Wccl::Bool> acc =
......@@ -348,53 +314,86 @@ boolean
// ----------------------------------------------------------------------------
// Setvar operator
// ----------------------------------------------------------------------------
/*
setvar_op
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret]
: setvar_pos [value]
| setvar_bool [value]
: ret = setvar_sset [vars]
| setvar_tset [value]
: ret = setvar_pos [vars]
| ret = setvar_bool [vars]
| ret = setvar_sset [vars]
| ret = setvar_tset [vars]
;
*/
// Implementations of setvar:
// ----------------------------------------------------------------------------
// setvar dla position przyjmuje position_ref -> TODO sprawdzic dlaczego
// gramatyka nie pokrywa "setvar" LPAREN position COMMA position_v RPAREN
/*
setvar_pos [std::string& value]
: "setvar" LPAREN position_ref [value] COMMA position_v [value] RPAREN
// : "setvar" LPAREN position [value] COMMA position_v [value] RPAREN
;
*/
/*
setvar_bool [std::string& value]
: "setvar" LPAREN boolean [value] COMMA boolean_v [value] RPAREN
// setvar dla position przyjmuje position_ref_variable -> TODO sprawdzic dlaczego
// gramatyka nie pokrywa "setvar" LPAREN position COMMA position_value RPAREN
setvar_pos
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
{
boost::shared_ptr<Wccl::Function<Wccl::Position> > ret_op;
boost::shared_ptr<Wccl::VarGetter<Wccl::Position> > ret_var;
}
: "setvar" LPAREN ret_var = position_variable [vars] COMMA
ret_op = op_position [vars] RPAREN {
Wccl::VariableAccesor<Wccl::Position> acc =
vars.create_accesor<Wccl::Position>(ret_var->acc_name());
op.reset(new Wccl::VarSetter<Wccl::Position>(acc, ret_op));
}
;
*/
// ----------------------------------------------------------------------------
setvar_bool
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
{
boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret_op;
boost::shared_ptr<Wccl::VarGetter<Wccl::Bool> > ret_var;
}
: "setvar" LPAREN ret_var = boolean_variable [vars] COMMA
ret_op = logical_predicates [vars] RPAREN {
/*
Wccl::VariableAccesor<Wccl::Bool> acc =
vars.create_accesor<Wccl::Bool>(ret_var->acc_name());
op.reset(new Wccl::VarSetter<Wccl::Bool>(acc, ret_op));
}
;
// ----------------------------------------------------------------------------
setvar_sset
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::VarSetter<Wccl::Bool> > op]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
{
boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > ret_str_var;
boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ret_str_op;
boost::shared_ptr<Wccl::Function<Wccl::StrSet> > ret_op;
boost::shared_ptr<Wccl::VarGetter<Wccl::StrSet> > ret_var;
}
: "setvar" LPAREN ret_str_var = str_set [vars] COMMA
ret_str_op = string_operators [vars] RPAREN {
// VariableAccesor<Bool> acc_t = cx.variables()->create_accesor<Bool>("True_bool");
// VarSetter<Bool> var_setter(acc_t, false_constant);
// Wccl::VariableAccesor<Wccl::StrSet> acc_t = vars->create_accesor<Wccl::StrSet>("True_bool");
: "setvar" LPAREN ret_var = str_set_variable [vars] COMMA
ret_op = string_operators [vars] RPAREN {
Wccl::VariableAccesor<Wccl::StrSet> acc =
vars.create_accesor<Wccl::StrSet>(ret_var->acc_name());
op.reset(new Wccl::VarSetter<Wccl::StrSet>(acc, ret_op));
}
;
// ----------------------------------------------------------------------------
setvar_tset
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
{
boost::shared_ptr<Wccl::Function<Wccl::TSet> > ret_op;
boost::shared_ptr<Wccl::VarGetter<Wccl::TSet> > ret_var;
}
: "setvar" LPAREN ret_var = sym_set_variable [vars] COMMA
ret_op = sym_set_operators [vars] RPAREN {
Wccl::VariableAccesor<Wccl::TSet> acc =
vars.create_accesor<Wccl::TSet>(ret_var->acc_name());
op.reset(new Wccl::VarSetter<Wccl::TSet>(acc, ret_op));
}
;
*/
/*
setvar_tset [std::string& value]
: "setvar" LPAREN sym_set [value] COMMA sym_set_v [value] RPAREN
;
*/
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
......@@ -411,8 +410,8 @@ sym_set_operators
op_sym_set
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::TSet> > op]
: op = sym_set [vars]
| op = sym_set_v
: op = sym_set_variable [vars]
| op = sym_set_value
;
// ----------------------------------------------------------------------------
......@@ -430,8 +429,8 @@ position_operators
op_position
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Position> > op]
: op = position [vars]
| op = position_v
: op = position_variable [vars]
| op = position_value
;
// ----------------------------------------------------------------------------
......@@ -457,7 +456,7 @@ op_orth
{
// TODO
}
: "orth" LBRACKET position_ref [vars] RBRACKET {
: "orth" LBRACKET position_ref_variable [vars] RBRACKET {
// ret = TODO
}
;
......@@ -468,7 +467,7 @@ op_base
{
// TODO
}
: "base" LBRACKET position_ref [vars] RBRACKET {
: "base" LBRACKET position_ref_variable [vars] RBRACKET {
// ret = TODO
}
;
......@@ -509,8 +508,8 @@ op_affix
op_str_set
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::StrSet> > op]
: op = str_set [vars]
| op = str_set_v
: op = str_set_variable [vars]
| op = str_set_value
;
// ----------------------------------------------------------------------------
......@@ -518,13 +517,6 @@ op_str_set
// Logical predicates
// Returns boost::shared_ptr<Wccl::Function<Wccl::Bool> >
// ----------------------------------------------------------------------------
predicates
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret]
: ret = logical_predicates [vars]
;
// Implementations of predicates:
// ----------------------------------------------------------------------------
logical_predicates
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > ret]
......@@ -536,7 +528,7 @@ logical_predicates
| ret = lpred_inter [vars]
| ret = lpred_eq [vars]
| ret = lpred_regex [vars]
// | ret = setvar_op [vars]
| ret = setvar_op [vars]
;
// ----------------------------------------------------------------------------
// comma-separated predicates
......@@ -601,8 +593,8 @@ lpred_nor
lpred_bool
[Wccl::Variables& vars]
returns [boost::shared_ptr<Wccl::Function<Wccl::Bool> > op]
: op = boolean [vars]
| op = boolean_v
: op = boolean_variable [vars]
| op = boolean_value
;
// ----------------------------------------------------------------------------
lpred_in
......@@ -617,17 +609,19 @@ lpred_in
: "in" LPAREN ss1 = string_operators [vars] COMMA
ss2 = string_operators [vars] RPAREN {
op.reset(
// new Wccl::IsSubsetOf(*ss1.get(), *ss2.get())
// 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(*ts1.get(), *ts2.get()));
}
/*
| "in" LPAREN p1 = position_operators [vars] COMMA
p2 = position_operators [vars] RPAREN {
// op.reset(new Wccl::IsSubsetOf(*p1.get(), *p2.get()));
}
*/
;
// ----------------------------------------------------------------------------
lpred_inter
......@@ -647,10 +641,12 @@ lpred_inter
ts2 = sym_set_operators [vars] RPAREN {
// op.reset(new Wccl::Intersects(*ts1.get(), *ts2.get()));
}
/*
| "inter" LPAREN p1 = position_operators [vars] COMMA
p2 = position_operators [vars] RPAREN {
// op.reset(new Wccl::Intersects(*p1.get(), *p2.get()));
}
*/
;
// ----------------------------------------------------------------------------
lpred_eq
......@@ -669,10 +665,12 @@ lpred_eq
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));
}
*/
;
// ----------------------------------------------------------------------------
......@@ -839,17 +837,20 @@ options {
paraphrase = "Symbol";
testLiterals = true;
}
// : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
: ('a'..'z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
// : ('a'..'z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
;
/*
VAR_NAME
options {
paraphrase = "Variable name";
}
: ('A'..'Z') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
;
*/
/*
TRUE_VALUE
options {
paraphrase = "True value";
......@@ -863,6 +864,7 @@ options {
}
: "False"
;
*/
WS
: ( ' '
......
......@@ -4,19 +4,26 @@ include_directories( ${CMAKE_SOURCE_DIR} )
add_definitions(-DLIBWCCL_WCCLPARSER_DATA_DIR="${PROJECT_SOURCE_DIR}/")
# String operator
add_executable(parser-strop
strop_main.cpp
strop_main.cpp
)
target_link_libraries (parser-strop wccl ${Boost_LIBRARIES} antlr)
add_executable(parser-val
val_main.cpp
# Bool operator
add_executable(parser-boolop
bool_main.cpp
)
target_link_libraries (parser-val wccl ${Boost_LIBRARIES} antlr)
target_link_libraries (parser-boolop wccl ${Boost_LIBRARIES} antlr)
# Tagset operator
add_executable(parser-tagop
tagset_main.cpp
)
target_link_libraries (parser-tagop wccl ${Boost_LIBRARIES} antlr)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})
#add_custom_target(test tests)
#add_custom_target(test-verbose ./tests --log_level=message)
......@@ -66,6 +66,12 @@ int main()
catch (antlr::MismatchedTokenException &e) {
std::cerr << e.getMessage() << std::endl;
}
catch (Wccl::InvalidVariableName &e) {
std::cerr << "Wccl::InvalidVariableName" << std::endl;
}
catch (Wccl::VariableTypeMismatch &e) {
std::cerr << "Wccl::VariableTypeMismatch" << std::endl;
}
catch (...) {
std::cerr << "[N] Syntax error!" << std::endl;
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment