Советы по генераторам парсеров на Python

Эй, ребята, это мой первый вопрос здесь о переполнении стека, и мне было интересно, могу ли я попросить совета у людей, которые знают немного больше о генераторах Python и Parser, чем я.

мне дали задачу, где я должен создать парсер для простого C-подобного языка. Я могу использовать любой язык программирования и инструменты, которые я хочу создать парсер, но я изучаю Python в то же время, поэтому это будет мой предпочтительный выбор.

есть несколько ограничений my Парсер должен следовать. Во-первых, он должен иметь возможность читать в текстовом файле, который содержит следующую информацию:

kind1 : spelling1
kind2 : spelling2
kind3 : spelling3
      .
      .
      .
kindn : spellingn

где каждый вид и правописание относятся к типу токена и значению языка. Этот файл является результатом ввода образца кода через лексический анализатор языка.

во-вторых, я должен иметь возможность настроить выход парсера. В идеале я хотел бы вывести файл, который преобразовал kind: spelling list в другую последовательность токены, которые будут переданы компилятору языка для преобразования в код сборки MIPS. Вот небольшой пример того, что я хотел бы, чтобы парсер мог производить:

%function int test
  %variable int x
  %variable int y
%begin
  %if %id y , %id x > %do
  %begin
    %return %num 0
  %end
  %return %num 1
%end

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

3 ответов


когда pyparsing - это инструмент python для генерации синтаксических анализаторов. Есть много интересных примеров.

легко начать:

from pyparsing import Word, alphas

# define grammar
greet = Word( alphas ) + "," + Word( alphas ) + "!"

# input string
hello = "Hello, World!"

# parse input string
print hello, "->", greet.parseString( hello )

похоже pyparsing работа для меня. И это также позволяет относительно легко манипулировать выходом.


Я рекомендую вам проверить Lark:https://github.com/erezsh/lark

Он может анализировать все контекстно-свободные грамматики, он автоматически создает AST (с номерами строк и столбцов), и он принимает грамматику в формате EBNF, который прост в написании, и он считается стандартным.