LINUX.ORG.RU

Как писать грамматики для языков

 ,


0

1

Приветсвую!

запилил тут язык для внутреннего пользования из которого потом собирается json schema. Попросили описать в грамматике, чтоб потом наши яваскриптеры (да и бекендеры тоже) смогли его имплиментировать. А я даже невкурсе как это делается. Кастую доку о том, как писать такие грамматики.

Видел варианты, но не вкурсе, какие их них правильные.

Заранее спасибо.



Последнее исправление: seryoga (всего исправлений: 1)

Так как еще Владимир Ильич говорил «нельзя верить всему, что написано в интенете», то тут внизу есть список литературы.

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 2)

Описать грамматику на antlr, а кодеры потом пускай хоть руками переписывают.

Deleted
()
Ответ на: комментарий от Deleted

Ух ты какая интересная штука. не знал про такое. Спасибо, поковыряю.

seryoga
() автор топика

Запилили язык, не имея даже приблизительного представления о грамматиках? Сильно. Достойно.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

ну так яж самоучка, херли. институтов по специальсти не кончали.

seryoga
() автор топика

Почитай про PEG, довольно прост и генераторы есть под все более менее развитые языки.

anonymous
()
Ответ на: комментарий от buddhist

Запилили язык, не имея даже приблизительного представления о грамматиках? Сильно. Достойно.

Все так делают, рекурсивным спуском. Никто по грамматикам не анализирует.

Einstok_Fair ★★☆
()
Ответ на: комментарий от Einstok_Fair

Рекурсивный спуск-то по правилам грамматики идёт=)

anonymous
()

Начни с Википедии:

https://en.m.wikipedia.org/wiki/Formal_grammar

Разбери классические примеры.

Разберитесь пример грамматики математических выражений (Google). Этого достаточно чтобы написать грамматику.

Главное что б контекстно свободная была. (CFG)

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от Einstok_Fair

Тебе уже ниже ответили, что рекурсивный спуск — это алгоритм для анализа по правилам некоторой грамматики. Если ты при этом не знаешь, какую грамматику используешь — твоя беда. Кроме того, самостоятельно парсеры и лексеры писать можно было в 1979, но никак не в 2019.

Впрочем, в твоей профнепригодности, мы на этом форуме уже неоднократно убеждались, тут речь о ТС идет.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Кроме того, самостоятельно парсеры и лексеры писать можно было в 1979, но никак не в 2019.

Что характерно, все по прежнему пишут ручками.

RazrFalcon ★★★★★
()
Ответ на: комментарий от buddhist

Кроме того, самостоятельно парсеры и лексеры писать можно было в 1979, но никак не в 2019.

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

Nexmean
()
Ответ на: комментарий от RazrFalcon

Это разные вещи, монстров что ты привел в пример хрен автоматизируешь. Не говоря уже про оптимизации. А для свого кастомного язык с десятком операций нет смысла тратится на парсеры.

anonymous
()
Ответ на: комментарий от Nexmean

По факту парсеры генерируемые из набора грамматик обычно слишком медленные

Есть пруфы этого факта? Опять же не для XML, JSON а для локальных DSLей.

anonymous
()

Грамматики контекстно-свободных языков обычно описываются в [Extended] Backus-Naur Form. PEG, рекурсивный спуск и прочее --- это уже больше детали реализации парсера.

Рекомендую книгу D. Grune, C.J.H. Jacobs, Parsing Techniques: A practical guide или А. Ахо, Р. Сети, Дж. Д. Ульман, Компиляторы: принципы, технологии, инструменты (известна как книга дракона (dragon book)), там есть главы про грамматики.

Jini ★★
()
Последнее исправление: Jini (всего исправлений: 1)

Не писать, рисовать. Синтаксические диаграммы.

anonymous
()

Про bnf уже писали. Краткий обзор грамматик и прочего есть в 'Компиляторы. Краткий справочник' Р. Хантер. Ещё у Никлауса Вирта есть книжка, называется примерно 'Построение компиляторов'. Книжки старые, 90 годов. Но зато тоненькие, меньше 300 страниц.

MyLord
()
Ответ на: комментарий от RazrFalcon

Уверен, что это нормально?

Я несколько месяцев назад хотел написать интерпретатор rockstar на lark (он мне приглянулся, когда я последний раз пилил DSL. но тогда я его не заюзал), чуть мозги не вывихнул, не осилил. Самому писать парсер интуитивно проще, но есть полное ощущение, что это не тру, на фоне наличия готовых инструментов для формалтного описания грамматики.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от anonymous

Сложно найти такие бенчмарки в интернете, нашёл только для JS.

https://sap.github.io/chevrotain/performance/

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

Опять же не для XML, JSON а для локальных DSLей.

Это нужно брать и самостоятельно код писать, а затем бенчить. Мне это делать, конечно же, лень.

Nexmean
()

Спасибо всем, куча инфы. ушел учиться.

На самом деле там нет сложных операторов а просто декларативный язычок, который позволяет сделать вот из этого

module test;
# comment line
# another comment
alias day = object { 
    integer 1..31 day = 1 # also comment
    integer 1..12 month = 1 
    integer 1900.. year = 1900 
}

alias dayTime = @day { 
    integer 0..23 hour 
    integer 0..59 min 
    integer 0..59 sec 
}

object test {
    required integer 0.. id
    string enum { "none", "act1", "act2", "act3" } action 
    @day lastDay = { day=14, month=8, year=2021 } 
    @dayTime lastCheck = { day=1, month=1, year=2012, hour=12, min=3 }
}
Вот это
"test": {
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "minimum": 0
    },
    "action": {
      "type": "string",
      "enum": [
        "none",
        "act1",
        "act2",
        "act3"
      ]
    },
    "lastDay": {
      "type": "object",
      "properties": {
        "day": {
          "type": "integer",
          "minimum": 1,
          "maximum": 31
        },
        "month": {
          "type": "integer",
          "minimum": 1,
          "maximum": 12
        },
        "year": {
          "type": "integer",
          "minimum": 1900
        }
      }
    },
    "lastCheck": {
      "type": "object",
      "properties": {
        "day": {
          "type": "integer",
          "minimum": 1,
          "maximum": 31
        },
        "month": {
          "type": "integer",
          "minimum": 1,
          "maximum": 12
        },
        "year": {
          "type": "integer",
          "minimum": 1900
        },
        "hour": {
          "type": "integer",
          "minimum": 0,
          "maximum": 23
        },
        "min": {
          "type": "integer",
          "minimum": 0,
          "maximum": 59
        },
        "sec": {
          "type": "integer",
          "minimum": 0,
          "maximum": 59
        }
      }
    }
  }
}
и вот это
  "test": {
    "lastDay": {
      "day": 14,
      "month": 8,
      "year": 2021
    },
    "lastCheck": {
      "day": 1,
      "month": 1,
      "year": 2012,
      "hour": 12,
      "min": 3,
      "sec": 0
    }
  }
Еще будет генерить протобуфер файлы

И да, про нормальные редакторы этой json схемы я вкурсе, но надо было «штоб быстро в vim/notepad поправить/добавить значения можно было»

seryoga
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.