2013-04-11 1 views
1

Я пишу спецификацию языка, и мне нужен следующий рудиментарный вопрос. Предположим, что у меня есть (правда надуманный) абстрактный синтаксис:Как обозначить семантику этого синтаксиса?

<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), так что, возможно, этого достаточно. Все материалы, которые я имею на эту тему, опускают эти очень простые, гайки и болты, аспект процесса определения языка из их обсуждений.

ответ

2

Семантика применяется к программе, генерируемой грамматикой. Когда вы создаете программу из этой грамматики, вы не увидите не-терминалы, поэтому вам не нужно определять семантику для них.

Рассмотрим пример:

Exp ::= Num | Exp + Exp 
Num ::= 0,1,2,... 

В этом примере необходимо определить семантику всего Num случая к случаю, но также важно определить семантику для Exp, потому что один из спектаклей, даже если не является терминал (но он имеет некоторое понятие о терминологии - + не собирается меняться) имеет какое-то особое значение, назначенное ему - дополнение.

Таким образом, вы будете делать следующим образом:

[[0]] = 0 // first 0 is just some string, the second is a number from N 
[[1]] = 1 ... 
[[Exp + Exp]] = [[Exp]] + [[Exp]] // first + sign is just string, 
            // the second is addtion in N 

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

Вы можете думать об этом следующим образом: когда ваше производство можно применять рекурсивно, вам нужно определить семантику для него - это в случае Exp + Exp. Num, однако, ведет прямо к терминалу независимо от того, что вы пытаетесь сделать.

Sidenote: Стоит упомянуть, почему мы даем грамматику для определения семантики.

Граммары - это наиболее удобные определения языка для определения семантики. Это объясняется тем, что семантика может быть легко определена с использованием индукции по структуре нашего языка. В нашем примере мы приводим правила для базовых корпусов - терминалов и нетривиального производства, например +.

 Смежные вопросы

  • Нет связанных вопросов^_^