Ответы пользователя по тегу Трансляторы
  • Парсинг грамматики в РБНФ?

    tsarevfs
    @tsarevfs
    C++ developer
    Мне кажется, что так или иначе, для построения парсера придется сконвертировать РБНФ в БНФ. Плюсом БНФ является то, что нет необходимости писать сложный парсер, чтобы считывать саму грамматику.
    Поэтому для начала реализуйте генератор парсера по БНФ грамматике.
    В приведенной вами статье есть РБНФ описание РБНФ грамматики. Вы можете вручную преобразовать его в БНФ и построить парсер для нее.
    Преобразование из РБНФ в БНФ будет заключатся в последовательной замене конструкций из РБНФ на несколько эквивалентных из БНФ. Я не уверен, что в результате получится сразу получить "хорошую" грамматику (в зависимости от выбранного алгоритма на грамматику могут накладываться различные ограничения, например отсутствие левой рекурсии, эпсилон-правил и.т.д). В таком случае придется нормализовывать полученную грамматику.
    Читайте dragon book, какой-то материал можно найти на вики.
    RE: UPD А грамматика из примера очень похожа на LL(1) грамматику. Если нет необходимости работать с РБНФ, считывание тривиальное. Правила с '|' стоит разбить на части с одинаковой левой частью. Identifier и Number я бы вообще для простоты сделал терминалами, и предоставил лексеру разбираться с ними. Про то как разбирать LL(1) грамматики, например, рекурсивным спуском материал найти очень легко.
    UPD2
    И да, еще придется подумать о том как задавать действия, которые вы хотите сделать (непосредственно компиляция С кода). Я реализовывал это на python, и все равно было много возни с этим.
    parser_gen.py и lexer_gen.py генерируют парсер_.py и лексер_.py по их описаниям в файлах *.txt
    main используя сгенерированные файлы запускает парсинг целевого текста.
    Ответ написан