Резумируем основные положения, изложенные ранее для реализации конкретного транслятора.
Алфавит — это некоторое конечное множество I с элементами, которые называются символами. Цепочкой или словом в алфавите I является конечная последовательность символов его символов. Цепочка, которая не содержит ни одного символа (обозначается ε), называется пустой. Языком в алфавите I является произвольное множество цепочек в I. Над языками возможны операции, которые порождают новые языки. Катенация цепочек Х и Y есть цепочка XY. Если L1 и L2 — два языка в алфавите I, то их теоретико-множественное объединение L1L2= {x|x`in` L1 или x`in` L2} и катенация L1 • L2={xy| x `in` L1& y`in` L2} являются новыми языками. Если L- язык, то итерация- возведение в степень L*=L0UL1UL2...=Si=0Li, где L0 ={ ε }, Li = L L i-1, i>1 есть новый язык.
Допустим, что символы (,),*,| не принадлежат алфавиту I. Тогда определенные цепочки в алфавите IU{(,),*,|} называются регулярными выражениями в I.
Каждое регулярное выражение однозначно определяет язык, который называется регулярным языком в алфавите I.
Регулярные выражения и задаваемые ими регулярные языки определяются так. Если а принадлежит I, то цепочка из одного символа а есть регулярное выражение, которое определяет язык, состоящий из одной цепочки а. Если цепочки r1, r2..., rn является регулярными выражениями для определения регулярных языков R1,R2, ...,Rn,то цепочки r1 |r2 |.., |rn , (r1 ), r1* также есть регулярные выражения, представляющие соответственно регулярные языки R1`uu` R2`uu` ...,`uu` Rn, R1,R2, ...,Rn ,R1 *.
Приведем примеры регулярных выражений над алфавитом I = {0, 1}.
Цепочка 01 представляет язык из одной цепочки {0 1};
Цепочка 1| 1(0|1)*1 задает язык, содержащий все цепочки, начинающиеся и оканчивающиеся 1.
Более сложные языки (множества) конструктивно задаются с помощью грамматик. Грамматика G = (Т, N, Р, S) состоит из объектов: Т - алфавит терминальных символов; N — алфавит нетерминальных символов (N `nn` Т = {}); S `in` N — исходный нетерминал; Р — конечное множество правил вывода вида А -> w, где А `in` N и w есть цепочка в алфавите N U Т.
Цепочка `eta` непосредственно выводима из цепочки `sigma` в грамматике G обозначается `sigma` ->`eta` ) тогда и только тогда, когда существуют цепочки `alpha` ,`beta` ,`nu` и нетерминал А, такие, что `sigma` = `alpha` A`beta` , `eta` = `alpha` `nu` `beta` и А -> `nu` `in` Р.
Цепочка `alpha` n выводима из цепочки `alpha` 0, (обозначение `alpha` 0 =*>`alpha` n) либо при `alpha` 0 =`alpha` n либо, если существуют последовательность цепочек `alpha` 1,`alpha` 2,...`alpha` n таких, что `alpha` i-1=>`alpha` iдля i = 1,...n.
Язык L(G), определяемый грамматикой G, представляет множество терминальных цепочек w в алфавите Т, выводимых из начального не-терминала S с помощью правил Р, т. е.
L (G) = {w| S=>w, w — терминальная цепочка}.
Приведем примеры грамматик и задаваемых ими языков.
Грамматика G1 = (Т1, N1, Р1, S) ,где Т1 = {х, у, z, w}, N1 = {S, А, В}, Р1= {S-> АВ, В-> х, В-> у, А->z, А-> w}, определяет язык L (G1) {zx, zy, wx, wy}.
Грамматика G2 = (Т2, N2, Р2, А), где Т2 = {х, +, [,]}, N2= {А, В}, Р2 = {А -> х, А-> [В], В-> А, В -> В + А}, определяет язык L (G2), состоящий из всех выражений, составленных из операндов х, операции + и квадратных скобок, вида х, [х], [х + х], [[х]], [х+ х+ х].
Грамматика G3 = (Т3, N3, P3E), где Т3 = {d,n, +, —, /,*, [,]}, N3= {Е}, Р3= {E->d, Е->n, Е->[E], Е->[Е+ Е], Е->[Е — Е], Е->[Е* Е], Е-> [Е/Е]}, определяет язык L (G3), состоящий из всех выражений в полной скобочной записи с операндами d и n и операциями +,-, *, /.
Имеются другие варианты грамматик, обладающие той же мощностью, но являющиеся во многих отношениях более наглядными. Это так называемые расширенные грамматики. Расширенная грамматика задается списком пар Аi-->ri , где все Аi — различные нетерминальные символы алфавита N; ri — регулярные выражения в алфавите N `uu` Т. Терминальный алфавит Т составляют символы, которые встречаются в цепочках ri, кроме символов из NU{(,),*,|}. Нетерминал первой пары считается главным, а алфавит терминальных символов извлекается из правых частей пар.
Опишем примеры расширенных грамматик.
Грамматики G11 = {S-> АВ, B`uu` х | у, A->z|w} или G12 = {S->{(z|w)(x|y) } задают тот же язык, что и G1.
Грамматика G22 = {А->х|[В], В->A|В + А} или->
G22= {А->х|[В], В->А {+А}*} или
G23= {А->х|[А (+A)*] } задают тот же язык, что и G2.
Грамматики G31 = {Е->d|n|[Е]|Е [+|-|*|/] Е]} определяет тот же язык, что и G3.