Ниже приводятся 13 регулярных выражений, представляющих полный синтаксис языка SPL. Первое из них – для главного (стартового) нетерминального символа PROG.
PROG®(DCONST | DFUNC | DVARB)* eof.
Здесь показано, что программа – это описание констант или описание функции, или описание переменных. Причем все эти описания заключены в круглые скобки, после которых стоит звездочка. Напомним, это означает, что эти описания могут повторяться нуль и больше раз. То есть может случиться, что ни одного из них нет. А за этими описаниями обязательно должна быть лексема eof – признак конца файла. Таким образом, в принципе программа может состоять только из признака конца файла.
DCONST®constl CONS (‘,’ CONS)* ‘;’.
Описание констант должно начинаться со служебного слова const, которому соответствует лексема constl в регулярном выражении. За лексемой должен быть нетерминальный символ CONS. Затем через запятую могут быть еще нуль и больше констант. В конце описания констант должна быть ‘;’.
CONS®iden ‘=’ [‘+’ | ‘-‘] numb.
Константа являет собой идентификатор, за которым следует ‘=’, а за ним – число с необязательным знаком.
Для лучшего понимания 2-го и 3-го регулярных выражений вспомним, как описываются константы в программе на языке SPL.
Например,const k=4, m=-5, q=125;
DVARB ? intl iden (‘,’ iden) * ‘;’.
Перед описанием переменных должно быть служебное слово int. Ему соответствует в регулярном выражении лексема intl. Далее должен следовать идентификатор. Через запятые могут быть еще идентификаторы. В конце описания ставится ‘;’.
DFUNC ? iden PARAN BODY.
Вначале следует имя функции, а за ним – описание параметров и тело функции.
PARAM ? ‘(‘ [iden (‘,’ iden) *] ‘)’.
При описании параметров обязательно должны быть круглые скобки. В них необязательно может быть идентификатор или последовательность идентификаторов через запятую.
7) BODY ? beginl (DVARB | DCONST)*STML endl.
Тело функции начинается служебным словом begin, которому соответствует лексема beginl. Далее могут следовать нуль и еще (много раз) описание переменных или констант. Затем – последовательность операторов и служебное слово end (лексема endl).
8) STML ? STAT (‘,’ STAT)*.
Последовательность операторов может состоять из одного или их последовательности через ‘,’.
9) STAT ? iden ‘=’ EXPR |
readl iden |
printl EXPR |
retrl EXPR |
ifl EXPR thenl STML endl |
whilel EXPR dol STML endl.
Операторы в языке SPL следующие:
1 Оператор присвоения, когда переменной присваивается результат вычисления выражения.
2 Чтение переменной.
3 Вывод на печать результата вычисления.
4 Возврат из функции результата вычисления.
5 Оператор условной передачи управления. Проверяется результат вычисления выражения. Если он больше нуля, то вычисляется последовательность операторов, расположенная между ключевыми словами then и end.
6 Оператор цикла. Последовательность операторов, расположенная между служебными (ключевыми) словами do и end, выполняется в цикле до тех пор, пока результат вычисления выражения после while больше нуля.
10) EXPR ? [‘,’ | ‘-‘] TERM ((‘+’ | ‘-‘) TERM)*.
Выражение представляет собой слагаемое, перед которым необязательно может стоять знак. Через знаки „+” или „-” могут также быть и другие слагаемые.
11) TERM ? FACT ((‘*’ | ‘/’ | ‘%’) FACT)*.
Слагаемое может состоять из одного множителя или через знаки „*” или „/”, или „%” следовать другие сомножители.
Множитель – это или выражение в круглых скобках, или число, или идентификатор. Последний может быть идентификатором переменной или же функции. Тогда за идентификатором следуют круглые скобки. Внутри них – необязательная последовательность выражений.