1) PROG – программа;
2) DCONST – описание констант;
3) CONS – константа;
4) DVARB – описание переменных;
5) DFUNC – описание функций;
6) PARAM – параметры функции;
7) BODY – тело функции;
8) STML – последовательность операторов;
9) STAT – оператор;
10) EXPR – выражение;
11) TERM – слагаемое;
12) FACT – множимое;
13) FCTL – последовательность выражений.
Ниже приводятся 13 регулярных выражений, представляющих полный синтаксис языка SPL. Первое из них для главного (стартового) нетерминального символа PROG.
1) PROG ® (DCONST | DFUNC | DVARB)* eof
Здесь показано, что программа – это описание констант или описание функций, или описание переменных. Причем все эти описания заключены в круглые скобки, после которых стоит звездочка. Напомним, это означает, что эти описания могут повторяться нуль и больше раз. То есть может случиться, что ни одного из них нет. А за этими описаниями обязательно должна быть лексема eof – признак конца файла. Таким образом, в принципе программа может состоять только из признака конца файла.
2) DCONST ® constl CONS (‘,’ CONS)* ‘;’
Описание констант должно начинаться со служебного слова const, которому соответствует лексема constl в регулярном выражении. За лексемой должен быть нетерминальный символ CONS. Затем через запятую могут быть еще нуль и больше констант. В конце описания констант должна быть ‘;’.
3) CONS ® iden ‘=’ [‘+’ | ‘-‘] numb
Константа являет собой идентификатор, за которым следует ‘=’, а за ним число с необязательным знаком.
Для лучшего понимания 2-го и 3-го регулярных выражений вспомним, как описываются константы в программе на языке SPL.
Например, const k=4, m=-5, q=125;
4) DVARB → intl iden (‘,’ iden) * ‘;’
Перед описанием переменных должно быть служебное слово int. Ему соответствует в регулярном выражении лексема intl. Далее должен следовать идентификатор. Через запятые могут быть еще идентификаторы. В конце описания ставится ‘;’.
5) DFUNC → iden PARAM BODY
Вначале следует имя функции, а за ним – описание параметров и тело функции.
6) PARAM → ‘(‘ [ iden (‘,’ iden) * ] ‘)’
При описании параметров обязательно должны быть круглые скобки. В них необязательно может быть идентификатор или последовательность идентификаторов через запятую.
7) BODY → beginl (DVARB | DCONST)* STML endl
Тело функции начинается служебным словом begin, которому соответствует лексема beginl. Далее могут следовать ноль и больше раз описание переменных или констант. Затем – последовательность операторов и служебное слово end (лексема endl).
8) STML → STAT (‘,’ STAT)*
Последовательность операторов может состоять из одного оператора или их последовательности через ‘,’.
9) STAT → iden ‘=’ EXPR |
readl iden |
pritl 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)*
Слагаемое может состоять из одного множителя или из соединенных знаками ‘*’, или ‘/’, или ‘%’ других сомножителей.
12) FACT → ‘(‘ EXPR ‘)’ | numb | iden [ ‘(‘ ]FCTL ] ’)’ ]
Множитель - это или выражение в круглых скобках, или число, или идентификатор. Последний может быть идентификатором переменной или же функции. Тогда за идентификатором следуют круглые скобки. Внутри них – необязательная последовательность выражений.
14) FCTL → EXPR (‘,’ EXPR)*
Это одно или несколько выражений через запятую.
Лекция 7