J язык программирования (E) BNF - PullRequest
3 голосов
/ 09 января 2020

Я пишу статью для своего курса «Языки программирования и компиляторы» о языке программирования J. Поскольку это относительно неизвестный (, но интересный ) язык программирования, у меня возникают проблемы с поиском нужной документации и информации относительно формальной грамматики J в (E) BNF, некоторых реализациях J с открытым исходным кодом, особенно лексические анализаторы и парсеры.

Кто-нибудь знает точный источник для (E) BNF для языка программирования J? Если да, то это LL грамматика и можно ли ее "пропустить" через генератор парсера?

Ответы [ 2 ]

5 голосов
/ 10 января 2020

(E) BNF - это техника обозначений для контекстно-свободных грамматик. Но J является контекстно-зависимым языком [1,2]. Правила синтаксического анализа J перечислены в Словаре II. E [3].

Ссылки:

  1. https://code.jsoftware.com/wiki/Guides/Language_FAQ/J_BNF
  2. http://www.jsoftware.com/pipermail/general/2005-July/023632.html
  3. https://www.jsoftware.com/help/dictionary/dicte.htm
4 голосов
/ 10 января 2020

J использует таблицу синтаксического анализа на основе стека, который оценивает предложение, как только у него будет достаточно информации. Я полагаю, что лучшим источником для этого являются главы 38 и 39 книги Генри Рича «J для C программистов». Вы должны быть в состоянии освоить tacit J, чтобы извлечь максимальную пользу из этого, но это должно послужить хорошим введением в анализатор. https://www.jsoftware.com/help/jforc/parsing_and_execution_i.htm#_Toc191734584 https://www.jsoftware.com/help/jforc/parsing_and_execution_ii.htm#_Toc191734586

Другим источником для понимания оценки J является глагол trace, который можно найти в скрипте трассировки, расположенном для последних версий J. например. для j901 в j901/addons/general/misc/trace.ijs Это дает практический опыт, который будет проходить через предложение J и перечислять реализованные правила и текущее состояние стека.

Если вы загрузили аддоны для J, это будет уже будет доступен в вашей установке.

    load '~addons/general/misc/trace.ijs'
  trace '(+/ % #) 5 7 3 4 5 2' NB. returns the trace for the average of list of numbers
 --------------- 3 Adverb -----
 +
 /
 +/
 --------------- 5 Trident ----
 +/
 %
 #
 +/ % #
 --------------- 8 Paren ------
 (
 +/ % #
 )
 +/ % #
 --------------- 0 Monad ------
 +/ % #
 5 7 3 4 5 2
 4.33333
 ==============================
4.33333
...