Пример #1
0
        public void ITC11LoadWord()
        {
            //// test loading of basic grammar elements
            var outNo = new List <TextElement>();
            var idn   = new WordIdent();
            var str   = new WordString();
            var sym   = new WordSymbol("symbol1");

            // load string + string + name
            TextBuffer textBuffer = Util.NewBufferWs("  Aname     symbol1      'Fghij'      sym02  ");

            idn.TextBuffer = textBuffer;
            sym.TextBuffer = textBuffer;
            str.TextBuffer = textBuffer;
            idn.TextBuffer = textBuffer;
            Assert.AreEqual(true, idn.Load(outNo, 0), "Can't read a combinded Identifier");
            Assert.AreEqual(true, sym.Load(outNo, 0), "Can't read a combinded Symbol");
            Assert.AreEqual(true, str.Load(outNo, 0), "Can't read a combinded String");
            Assert.AreEqual(true, idn.Load(outNo, 0), "Can't read a combinded Identifier");
            textBuffer.FindNextWord(null, false);
            CodeElement node = outNo[1] as CodeElement;

            Assert.IsNotNull(node, "Can't find node after reading combinded Quote");
            Assert.AreEqual("Fghij", node.Value, "The combinded Quote value is not correct");
            node = outNo[2] as CodeElement;
            Assert.IsNotNull(node, "Can't find node after reading combinded VarName");
            Assert.AreEqual("sym02", node.Value, "The combinded VarName value is not correct");
            Assert.AreEqual(45, textBuffer.PointerNextChar, "The buffer pointer is of after reading combinded values");
        }
Пример #2
0
        public void ITC10Load()
        {
            var word = new WordIdent();

            Util.ParserLoadWord(word, "  sym01  ", "sym01", MetaParser.WordIdent__, 2, 7, 9);
            //            "123456789
        }
Пример #3
0
        public void ITC10LoadError()
        {
            string testName = "Ident";
            var    word     = new WordIdent();

            //                 "1234   Read 'identifier', EOF error.
            Util.WordLoadError("   ", word, testName,
                               "itc01: Syntax error (testRule). Expecting identifier, found EOF. Line 1, colomn 4");

            //                 "123456  Read 'identifier', not allowed first letter.
            Util.WordLoadError(" 2r  ", word, testName,
                               "itc10: Syntax error (testRule). Expecting identifier, found 2. Line 1, colomn 2");
        }
Пример #4
0
        private static List <ParserElementBase> BuildExpression(Parser parser, IEnumerable <CodeElement> docNodes, ParserStatus status)
        {
            //string debug1 = "(" + parser.Name + ")".NL() + docNotes.Aggregate("", (s, n) => s + n.ToMarkupProtected(""));

            List <ParserElementBase> elements = new List <ParserElementBase>();

            foreach (CodeElement element in docNodes)
            {
                switch (element.Name)
                {
                case MetaParser.Expression_:
                    if (docNodes.Count() > 1)
                    {
                        status.AddBuildError(() => MessageRes.itc29, element, parser.Name);
                    }

                    return(BuildExpression(parser, element.Codes(), status));

                case MetaParser.Or_________:
                    ParserElementBase  el1, el2;
                    List <CodeElement> orNodes = docNodes.ToList();
                    // find position
                    int pos = 0;
                    while (pos + 2 < orNodes.Count() && orNodes[++pos] != element)
                    {
                    }
                    if (pos < 1 || pos + 2 > orNodes.Count())
                    {
                        status.AddBuildError(() => MessageRes.itc30, element, parser.Name);
                    }

                    if (pos == 1)
                    {
                        el1 = elements[0];
                    }
                    else
                    {
                        el1 = new SetOfElements(elements.ToArray());
                    }

                    var elementElements2 = new List <CodeElement>();
                    for (int i = pos + 1; i < orNodes.Count(); i++)
                    {
                        elementElements2.Add(orNodes[i]);
                    }
                    List <ParserElementBase> elements2 = BuildExpression(parser, elementElements2, status);

                    if (elements2.Count() == 1)
                    {
                        el2 = elements2[0];
                    }
                    else
                    {
                        el2 = new SetOfElements(elements2.ToArray());
                    }
                    return(new List <ParserElementBase> {
                        new Or(el1, el2)
                    });

                case MetaParser.WordIdent__:
                    ParserElementBase elem;
                    switch (element.Value)
                    {
                    case MetaParser.WordString_:
                        elem = new WordString();
                        break;

                    case MetaParser.WordInt____:
                        elem = new WordInt();
                        break;

                    case MetaParser.WordFloat__:
                        elem = new WordFloat();
                        break;

                    case MetaParser.WordIdent__:
                        elem = new WordIdent();
                        break;

                    case MetaParser.WordBool___:
                        elem = new WordBool();
                        break;

                    default:
                        elem = new RuleLink(element.Value);
                        elem.DefinitionCodeElement = element;
                        break;
                    }
                    elements.Add(elem);
                    break;

                case MetaParser.WordSymbol_:
                    elements.Add(new WordSymbol(element.Value));
                    break;

                case MetaParser.Sequence___:
                    elements.Add(new Sequence(BuildExpression(parser, element.Codes(), status).ToArray()));
                    break;

                case MetaParser.Optional___:
                    elements.Add(new Optional(BuildExpression(parser, element.Codes(), status).ToArray()));
                    break;

                case MetaParser.Parentheses:
                    elements.Add(new Parentheses(BuildExpression(parser, element.Codes(), status).ToArray()));
                    break;

                case MetaParser.Comment____:
                    break;

                default:
                    status.AddBuildError(() => MessageRes.itc31, element, element.Name);
                    break;
                }
            }
            return(elements);
        }