Построение грамматики в слое - рекурсия разрешена?

Использование Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication53
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            foreach (XElement g_1 in doc.Descendants("G_1"))
            {
                string leader = "";

                foreach (XElement element in g_1.Elements())
                {
                    string output = string.Format("{0}{1}:{2}", leader, element.Name.LocalName, (string)element);
                    Console.WriteLine(output);

                    if (leader.Length == 0) leader = "     ";
                }
            }
            Console.ReadLine();
        }
    }
}
0
задан Jan 19 January 2019 в 19:20
поделиться

1 ответ

Скобки в выражении довольно распространены. Сначала я отошлю вас к части 5 документации PLY , в которой приведен пример разбора вложенных выражений. Да, рекурсия - это ответ.

Есть несколько фраз, которые используются для обозначения «наименьшего элемента выражения». Вы можете увидеть «atom» или «term» (сокращение от «Terminal») или «primary-expression».

При работе с подвыражениями в скобках обычно используется именно такой подход. Напишите правило грамматики, которое объединяет различные низкоуровневые вещи (например, литеральные числа и имена переменных) и добавьте под-выражение в этой точке.

В этом примере, из документов PLY, expression является вещью самого высокого уровня и поддерживает сложение и вычитание. Следующий уровень - term, который поддерживает умножение и деление. Самым низким уровнем является factor, который не поддерживает никаких операций, но объединяет NUMBER и подвыражения в скобках. Фактором может быть 7, но также может быть (7 + 2 * 3).

 expression : expression + term
            | expression - term
            | term

 term       : term * factor
            | term / factor
            | factor

 factor     : NUMBER
            | ( expression )
0
ответ дан aghast 19 January 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: