irules/irules.core/Clause.cs

46 lines
1.8 KiB
C#

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;
}
}
}