Разбор CSS 2.1 с правильными соглашениями об разборе CSS в ANTLR - PullRequest
4 голосов
/ 25 марта 2011

Грамматика CSS2.1 содержит строгое указание на , а не синтаксический анализ CSS напрямую таким образом, "поскольку оно не выражает соглашений парсинга , толькоСинтаксис CSS 2.1. "

Действительно, любой синтаксический анализатор, который игнорирует эти правила синтаксического анализа (как мы пытались это сделать), сталкивается с проблемами при работе со страницами, содержащими ошибки или неизвестные конструкции.

Поэтому мыХотелось бы, чтобы наш синтаксический анализатор CSS2.1 ANTLR - который в настоящее время не следует соглашениям синтаксического анализа с прямой совместимостью и обработкой ошибок - каким-то образом использовал дерево синтаксического анализа, сгенерированное базовой грамматикой, которая включает соглашения синтаксического анализа.(Возможно, последнее может быть сгенерировано другим синтаксическим анализатором ANTLR.)

Это разумный подход?Существуют ли хорошо понятые методы для этого?

Повторюсь, цель состоит в том, чтобы создать надежный синтаксический анализатор CSS2.1, который может корректно обрабатывать ошибки и новые конструкции в соответствии с соглашениями CSS по синтаксическому анализу.

1 Ответ

2 голосов
/ 28 марта 2011

Мы придерживались общего подхода выше, который, как мы думали, может сработать;это так.

Вкратце, у нас есть два синтаксических анализатора ANTLR: один для основной грамматики CSS, а другой для грамматики CSS2.1.Парсер CSS2.1 может выполняться независимо от основного парсера CSS.Тем не менее, это не так, как это на самом деле используется.

Основной синтаксический анализатор CSS используется для создания базового дерева синтаксического анализа.Действия правила повторно анализируют текст, используя соответствующие точки входа грамматики CSS 2.1, чтобы получить те же объекты C #, которые грамматика CSS2.1 создала бы при выполнении автономно.Например, действие набора правил в основном синтаксическом анализаторе CSS повторно анализирует сопоставленный текст, используя точку входа набора правил в грамматике CSS 2.1, и добавляет полученные результаты к своему результату.

Несколько важных моментов, которые потребовалисьНам нужно много времени, чтобы выяснить:

  1. Правила синтаксического анализа ANTLR, вызываемые из внешнего кода, отличаются в том, как они обрабатывают EOF, по сравнению с точками входакоторые называются по другим правилам.

  2. Базовая грамматика CSS должна быть расширена в зависимости от того, на какой уровень CSS на самом деле транслируется, не нарушая соглашения о разборе.Одним из примеров является @media at-rule, блок которого содержит наборы правил, которые необходимо было проанализировать, насколько это возможно, с использованием соглашений о синтаксическом анализе, перед передачей в синтаксический анализатор CSS2.1.

Надеюсь, это поможет другим, желающим сделать то же самое.

...