|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using Irony.Interpreter.Ast;
|
|
|
|
|
using Irony.Parsing;
|
|
|
|
|
|
|
|
|
|
namespace irules.core
|
|
|
|
|
{
|
|
|
|
|
[Language("IRule", "0.1", "Clauses grammar.")]
|
|
|
|
|
public class ClauseGrammar : Grammar
|
|
|
|
|
{
|
|
|
|
|
public ClauseGrammar()
|
|
|
|
|
{
|
|
|
|
|
var comment = new CommentTerminal("comment", "#", "\n");
|
|
|
|
|
NonGrammarTerminals.Add(comment);
|
|
|
|
|
NonTerminal expr = new NonTerminal("expr");
|
|
|
|
|
NonTerminal singleByOr = new NonTerminal("singleByOr");
|
|
|
|
|
NonTerminal singleByAnd = new NonTerminal("singleByAnd");
|
|
|
|
|
NonTerminal idList = new NonTerminal("idList");
|
|
|
|
|
NonTerminal idOrRelation = new NonTerminal("idOrRelation");
|
|
|
|
|
NonTerminal SOrOr = new NonTerminal("SOrOr");
|
|
|
|
|
IdentifierTerminal id = new IdentifierTerminal("Id");
|
|
|
|
|
var orExpr = new NonTerminal("OrExpr", typeof(BinaryOperationNode));
|
|
|
|
|
var andExpr = new NonTerminal("AndExpr", typeof(BinaryOperationNode));
|
|
|
|
|
var neg = new NonTerminal("Negation", typeof(UnaryOperationNode))
|
|
|
|
|
{
|
|
|
|
|
Rule = "^" + andExpr + ReduceHere()
|
|
|
|
|
};
|
|
|
|
|
expr.Rule = "(" + expr + ")" | SOrOr ;
|
|
|
|
|
SOrOr.Rule = orExpr | singleByOr;
|
|
|
|
|
orExpr.Rule = expr + "|" + expr;
|
|
|
|
|
singleByOr.Rule = andExpr | singleByAnd;
|
|
|
|
|
andExpr.Rule = expr + "&" + expr;
|
|
|
|
|
singleByAnd.Rule = neg | idOrRelation;
|
|
|
|
|
idOrRelation.Rule = id | id + "(" + idList + ")";
|
|
|
|
|
idList.Rule = id | idList + "," + id;
|
|
|
|
|
RegisterBracePair("(", ")");
|
|
|
|
|
RegisterOperators(30, "&|^");
|
|
|
|
|
Root = expr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|