Мы придерживались общего подхода выше, который, как мы думали, может сработать;это так.
Вкратце, у нас есть два синтаксических анализатора ANTLR: один для основной грамматики CSS, а другой для грамматики CSS2.1.Парсер CSS2.1 может выполняться независимо от основного парсера CSS.Тем не менее, это не так, как это на самом деле используется.
Основной синтаксический анализатор CSS используется для создания базового дерева синтаксического анализа.Действия правила повторно анализируют текст, используя соответствующие точки входа грамматики CSS 2.1, чтобы получить те же объекты C #, которые грамматика CSS2.1 создала бы при выполнении автономно.Например, действие набора правил в основном синтаксическом анализаторе CSS повторно анализирует сопоставленный текст, используя точку входа набора правил в грамматике CSS 2.1, и добавляет полученные результаты к своему результату.
Несколько важных моментов, которые потребовалисьНам нужно много времени, чтобы выяснить:
Правила синтаксического анализа ANTLR, вызываемые из внешнего кода, отличаются в том, как они обрабатывают EOF, по сравнению с точками входакоторые называются по другим правилам.
Базовая грамматика CSS должна быть расширена в зависимости от того, на какой уровень CSS на самом деле транслируется, не нарушая соглашения о разборе.Одним из примеров является @media at-rule, блок которого содержит наборы правил, которые необходимо было проанализировать, насколько это возможно, с использованием соглашений о синтаксическом анализе, перед передачей в синтаксический анализатор CSS2.1.
Надеюсь, это поможет другим, желающим сделать то же самое.