Я пишу спецификацию языка, и мне нужен следующий рудиментарный вопрос. Предположим, что у меня есть (правда надуманный) абстрактный синтаксис:Как обозначить семантику этого синтаксиса?
<A> ::= <B> | <C>
<B> ::= 1 | 2 | 3
<C> ::= 4 | 5 | 6
Что денотационную семантику этого языка выглядеть? Нетерминалы заключены в '<' и '>', а терминалы - нет. Я хочу на карте 1
... 6
в натуральное выражение. Мне совсем не ясно, нужно ли мне предоставлять сопоставления для не-терминалов. Кажется, мне не нужно, так как, например, <A> ::= <B> | <C>
не имеет смысла; это просто немного структуры. Игнорируйте, на данный момент может полностью исключить это правило.
Так, как он стоит, это то, что я думаю, что полное денотационное определение должно выглядеть, где правая часть (курсив) представляет соответствующее значение из натуральных чисел:
[[1]] =
один
[[2]] =
два
[[3]] =
три
[[4]] =
четыре
[[5]] =
пять
[[6]] =
шесть
Эстетически, мне кажется странным, не говоря уже о A
, B
или C
вообще, но я полагаю, что эти символы никогда не появится в актуальной программе (например: 4
), так что, возможно, этого достаточно. Все материалы, которые я имею на эту тему, опускают эти очень простые, гайки и болты, аспект процесса определения языка из их обсуждений.