/// <summary> /// Moves to the next token if the current token is of the given type, othervise does nothing /// </summary> /// <param name="lexrule"></param> public void SkipIf(Lexrule lexrule) { if (Current.type == lexrule) { Next(); } }
/// <summary> /// Moves to the next token and asserts that it is of the given type /// </summary> /// <param name="lexrule"></param> /// <returns></returns> public Token AssertNext(Lexrule lexrule) { var r = Next(); Assert(lexrule); return(r); }
/// <summary> /// throws a parser exception if the current tokens type is not the specified value /// </summary> /// <param name="lexrule"></param> public void Assert(Lexrule lexrule) { if (Current.type != lexrule) { throw new ParserException("TokneReader assertion failed"); } }
internal IRule GetRuleWithModifier(string name) { /* * rule? * rule* * rule+ * 'rule' */ bool sw(string c) => name.StartsWith(c); bool ew(string c) => name.EndsWith(c); if (ew("?") || ew("*") || ew("+")) { return(ModifiedRule.CreateModifiedRule(GetRule(name.TrimEnd('?', '*', '+')), name.Last())); } if (sw("'") && ew("'")) { var r = new Lexrule("inline" + inlineId++, name.Trim('\'')); lexer.InsertRule(0, r); return(r); } return(GetRule(name)); }
private void initializeRules() { var thisType = this.GetType(); var fields = thisType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).Where(x => x.IsDefined(typeof(RuleAttribute), false)); // init lexer: var lexrules = new List <Lexrule>(); var lexrulesProps = fields.Where(x => x.FieldType == typeof(Lexrule)); foreach (var item in lexrulesProps) { var at = item.GetCustomAttributes(typeof(RuleAttribute), false)[0] as RuleAttribute; var skipat = item.GetCustomAttributes(typeof(SkipAttribute), false).FirstOrDefault(); var lr = new Lexrule(item.Name, skipat != null, at.pattern); lr.createNode = at.createNode; lexrules.Add(lr); item.SetValue(this, lr); } lexer = new Lexer(lexrules); // init parserules: var parserulesProps = fields.Where(x => x.FieldType == typeof(Parserule)); foreach (var item in parserulesProps) { var at = item.GetCustomAttributes(typeof(RuleAttribute), false)[0] as RuleAttribute; var rule = new Parserule(item.Name, at.pattern); rule.createNode = at.createNode; parserules.Add(rule); item.SetValue(this, rule); } foreach (var item in parserules) { item.Initialize(this); } }
public void InsertRule(int index, Lexrule rule) => rules.Insert(index, rule);
public void AddRule(Lexrule rule) => rules.Add(rule);
internal Token(Lexrule rule, string value) { type = rule; this.value = value; }