Beispiel #1
0
 /// <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();
     }
 }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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");
     }
 }
Beispiel #4
0
        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));
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
 public void InsertRule(int index, Lexrule rule) => rules.Insert(index, rule);
Beispiel #7
0
 public void AddRule(Lexrule rule) => rules.Add(rule);
Beispiel #8
0
 internal Token(Lexrule rule, string value)
 {
     type = rule; this.value = value;
 }