Как реализуются типы в языке логического программирования с использованием BNFC?

Я работаю над реализацией языка логического программирования с использованием BNFC. Проблема, с которой я столкнулся, связана с правилами набора текста. В книге A.Ranta «Реализация языков программирования» типы включены в синтаксис LBNF, как в

Tbool. Type ::= "bool" ;
Tdouble. Type ::= "double" ;
Tstring. Type ::= "string";

Я понимаю, что для таких грамматик, как в C, важно добавлять типы, поскольку они являются неотъемлемой частью объявлений и, следовательно, должны анализироваться внешним интерфейсом. Далее в книге проверка типов написана на Haskell или Java. Однако в логическом PL типы не так явны, они объявляются отдельно, примерный синтаксис типов закодирован как:

tid: name_type
ty: type
varTy: tid -> ty
arrTy: ty x ty -> ty

Итак, вопрос в том, где в коде находится синтаксис типов? Всякий раз, когда я пытаюсь добавить типы в BNFC, это просто не имеет особого смысла, и проверенный ввод не анализируется должным образом. В книге есть хороший пример грамматики C, но нет полной картины того, как связаны интерфейс, созданный BNFC, и проверка типов, как информация передается от одного к другому и т. д.


person MayaJ    schedule 13.08.2020    source источник


Ответы (1)


Я не знаком с BNFC, но из того, что я вижу, это просто какая-то спецификация компилятора компилятора.

Итак, вопрос в том, где в коде находится синтаксис типов?

Классический способ заключается в обработке проверки типов не на уровне синтаксиса, а на семантическом уровне. Или, если ваш язык является интерпретируемым, во время выполнения, во время интерпретации.

person LeleDumbo    schedule 13.08.2020