Лучшие практики для записи синтаксического анализатора языка программирования

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

WITH
    TasksGroupedByUser(Task, UserCount) AS
    (
        SELECT Task, COUNT(DISTINCT [User])
        FROM Tasks
        GROUP BY Task
    )
SELECT
    Tasks.*,
    CASE
        WHEN TasksGroupedByUser.UserCount > 1 THEN 'Group'
        ELSE 'Individual' + ' ' + Tasks.[User]
    END
FROM Tasks
    INNER JOIN TasksGroupedByUser ON
        TasksGroupedByUser.Task = Tasks.Task
26
задан iammilind 27 November 2012 в 04:21
поделиться

7 ответов

Полученная мудрость должна использовать парсеры-генераторы + грамматики, и она походит на хороший совет, потому что Вы используете строгий инструмент и по-видимому уменьшаете усилие и потенциал для ошибок при этом.

Для использования парсера-генератора грамматика должна быть свободным контекстом. При разработке languauge, который будет проанализирован затем, можно управлять этим. Если Вы не уверены затем, что это могло бы стоить Вам большого усилия при запуске вниз маршрута грамматики. Даже если это - контекст, свободный на практике, если грамматика не огромна, может быть более просто вручить коду рекурсивный достойный синтаксический анализатор.

Являющийся свободным контекстом не только делает парсер-генератор возможным, но он также делает кодированные синтаксические анализаторы руки намного более простыми. То, с чем Вы заканчиваете, является одним (или два) функции на фразу. Который является, если Вы организуете и называете код, чисто не намного более твердо видеть, чем грамматика (если Ваш IDE может показать вызов hierachies затем, можно в значительной степени видеть то, что грамматика).

advantages:-

  • Более простая сборка
  • Лучшая производительность
  • Лучшее управление вывода
  • Может справиться с маленькими отклонениями, например, работать с грамматикой, которая не является 100%-м контекстом, свободным

, я не говорю, что грамматики являются всегда неподходящими, но часто преимущества минимальны и часто взвешиваются затратами и рисками.

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

19
ответ дан grzkv 28 November 2019 в 07:00
поделиться

Немного советов:

  • Знают, что Ваша грамматика - записывает, она в подходящей форме
  • Выбирает правильный инструмент. Это из C++ с Spirit2x, или выбирают внешние инструменты синтаксического анализатора как antlr, yacc, или безотносительно исков Вы
  • Делаете Вам нужен синтаксический анализатор? Возможно, regexp будет достаточен? Или, возможно, взломайте сценарий жемчуга для добиваний цели? Синтаксические анализаторы комплекса записи занимают время.
10
ответ дан Anonymous 28 November 2019 в 07:00
поделиться

Не злоупотребляйте регулярные выражения - в то время как у них есть свое место, они просто не имеют права обрабатывать любой вид реального парсинга. Можно продвинуть их, но Вы в конечном счете собираетесь врезаться в стену или закончиться с неудобной в сопровождении путаницей. Вы - более обеспеченное нахождение парсера-генератора, который может обработать больший набор языка. Если Вы действительно не хотите входить в инструменты, можно посмотреть на синтаксические анализаторы с рекурсивным спуском - это - действительно простой шаблон для почерка маленький синтаксический анализатор. Они не так гибки или мощны как большие парсеры-генераторы, но у них есть намного более короткая кривая обучения.

, Если у Вас нет очень трудных требований к производительности, попытайтесь разделить свои слои - чтения лексического анализатора в отдельных маркерах, синтаксический анализатор располагает тех, которые в дерево, и затем семантический анализ проверяет все и соединяет ссылки и затем заключительную фазу для вывода то независимо от того, что производится. Разделение различных частей логики сделает вещи легче поддержать позже.

7
ответ дан Eclipse 28 November 2019 в 07:00
поделиться

Считайте большую часть книга Дракона сначала.

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

7
ответ дан alex 28 November 2019 в 07:00
поделиться

Да. Попытайтесь генерировать его, не пишут. Рассмотрите использование yacc, ANTLR, Flex/бизона, Coco/R, ЗОЛОТОГО Парсера-генератора, и т.д. Обратитесь к ручной записи синтаксического анализатора, только если ни один из существующих парсеров-генераторов не соответствует Вашим потребностям.

5
ответ дан Anton Gogolev 28 November 2019 в 07:00
поделиться
  • Выбирают правильный вид синтаксического анализатора, иногда Рекурсивный Потомок будет достаточно, иногда необходимо использовать LR-анализатор (также, существует много типов LR-анализаторов).
  • , Если у Вас есть сложная грамматика, создайте Абстрактное синтаксическое дерево.
  • Попытка определить очень хорошо, что входит в лексический анализатор, что является частью синтаксиса и что является вопросом семантики.
  • Попытка сделать синтаксический анализатор наименее двойным к реализации лексического анализатора как возможный.
  • Предоставляют хороший интерфейс пользователю, таким образом, он - агностик реализации синтаксического анализатора.
3
ответ дан Null303 28 November 2019 в 07:00
поделиться

Во-первых, не пытайтесь применить те же методы к парсингу всего. Существуют многочисленные случаи возможного применения от чего-то как IP-адреса (немного специального кода) к программам C++ (которым нужен синтаксический анализатор промышленной силы с обратной связью от таблицы символов), и от ввода данных пользователем (который должен быть обработан очень быстро) к компиляторам (который, обычно может позволять себе провести немного времени, анализируя). Вы могли бы хотеть указать то, что Вы делаете, если Вы хотите полезные ответы.

111-секундный, имейте грамматику в виду для парсинга с. Чем более сложно это, тем более формальна спецификация должна быть. Попытайтесь допустить ошибку на стороне того, чтобы быть слишком формальным.

В-третьих, хорошо, который зависит от того, что Вы делаете.

2
ответ дан David Thornley 28 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

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