using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using Irony.Ast; 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 = "^" + singleByOr + 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; } } }