Рубрики
Без рубрики

Учебное пособие по грамматике без контекста

Недавно я наткнулся на учебное пособие по контекстно-свободным грамматикам с несколькими примерами распространенных шаблонов… Помечено как программирование, интерпретаторы, синтаксический анализ, java.

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

Сначала мне нужно было выбрать язык Java и инструменты для реализации примеров с помощью JFlex и Джек . Эта пара достаточно похожа на Flex и Bison, и, надеюсь, грамматики не будут затенены реализацией.

Я познакомился с Flex и Yacc и сделал три заметки о работе с ними:

  • Познакомьтесь с JFlex — введение в JFlex с небольшим примером автономного лексера,
  • Используйте JFlex для подсчета слов — еще один пример автономного лексера, на этот раз немного более сложный,
  • Используйте JFlex и Jacc вместе — как заставить JFlex и Jacc сотрудничать, также с элементарным примером.

Если вы заинтересованы в CFG и синтаксическом анализе, учебное пособие, о котором я упоминал, – неплохое место, чтобы получить некоторый практический опыт их реализации. Вы можете найти его здесь и я также загрузил его в Github (надеясь, что не нарушил никаких законов об авторском праве).

Грамматика, которую я использовал, чтобы продемонстрировать, как Flex и Jacc работают вместе, на самом деле является грамматикой из раздела 2.1 руководства (“Грамматика для языка, который допускает список X”) так что на самом деле я уже начал выполнять упражнения. Ура.

Использование Graphviz вы можете получить визуальное представление ваших грамматик. Сначала экспортируйте грамматику в виде точечного файла:

jacc -d Parser.jacc

Это создает Parser.dot. Затем

dot -Tjpg Parser.dot -o Parser.jpg

и в итоге вы получаете Parser.jpg . Это очень просто:

Это конечный автомат, представленный в виде ориентированного графа. Создание визуальных представлений грамматики – это всего лишь один из инструментов, предоставляемых Jacc для отладки ваших грамматик. Вы можете экспортировать грамматику в текстовый файл:

jacc -v Parser.jacc

Это создает Parser.output:

// Output created by jacc on Wed Mar 13 09:15:29 CET 2019

state 0 (entry on sentence)
    $accept : \_sentence $end

X shift 2
    . error

sentence goto 1

state 1 (entry on sentence)
    $accept : sentence\_$end
    sentence : sentence\_X (2)

$end accept
    X shift 3
    . error

state 2 (entry on X)
    sentence : X\_ (1)

$end reduce 1
    X reduce 1
    . error

state 3 (entry on X)
    sentence : sentence X\_ (2)

$end reduce 2
    X reduce 2
    . error

4 terminals, 1 nonterminals;
2 grammar rules, 4 states;
0 shift/reduce and 0 reduce/reduce conflicts reported.

или в html-файл:

jacc -h Parser.jacc

Это создает ParserMachine.html:

Сгенерированная машина для синтаксического анализатора

// Output created by jacc on Wed Mar 13 09:20:03 CET 2019


state 0 (entry on sentence) $accept : _sentence $end X shift 2 . error sentence goto 1
state 1 (entry on sentence) $accept : sentence_$end sentence : sentence_X (2) $end accept X shift 3 . error
state 2 (entry on X) sentence : X_ (1) $end reduce 1 X reduce 1 . error
state 3 (entry on X) sentence : sentence X_ (2) $end reduce 2 X reduce 2 . error 4 terminals, 1 nonterminals; 2 grammar rules, 4 states; 0 shift/reduce and 0 reduce/reduce conflicts reported.

Вы действительно можете просмотреть состояния машины, перейдя по ссылкам.

Jacc также поддерживает отслеживание вашей грамматики на примерах входных данных и встраивание пользовательских ошибок в грамматики — вот и все. ttfn!

Оригинал: “https://dev.to/vicentemaldonado/a-context-free-grammar-tutorial-38b5”