SimplePascal Grammar
Lyt
一、简介
1. 数据类型:整型integer、浮点型real、布尔型boolean
2. 有且只有一个main函数,从调用main函数开始执行程序
3. 大小写不敏感
二、词法
1. 关键字
词法单元 | 记号 | 说明 |
function | keywordFUNCTION | 函数(有返回值) |
procedure | keywordPROCEDURE | 函数(无返回值) |
var | keywordVAR | 声明变量 |
integer | keywordINTEGER | 整型 |
real | keywordREAL | 浮点型 |
boolean | keywordBOOLEAN | 布尔型 |
true | keywordTRUE | 真 |
false | keywordFALSE | 假 |
or | keywordOR | 或 |
and | keywordAND | 与 |
not | keywordNOT | 非 |
while | keywordWHILE |
|
do | keywordDO |
|
repeat | keywordREPEAT |
|
until | keywordUNTIL |
|
break | keywordBREAK |
|
continue | keywordCONTINUE |
|
if | keywordIF |
|
then | keywordTHEN |
|
else | keywordELSE |
|
begin | keywordBEGIN | 模块开始 |
end | keywordEND | 模块结束 |
sizeof | keywordSIZE_OF | 获得某类型字节 |
2. 标识符:字母或下划线开头,由字母、下划线、数字构成
词法单元 | 记号 | 说明 |
标识符 | ID | [_a-zA-Z]+([_0-9a-zA-Z])* |
3. 字面量
词法单元 | 记号 | 说明 |
整数 | valueINTEGER | [0-9]+ |
浮点数 | valueREAL | [0-9]+.[0-9]+ |
布尔值 | keywordFALSE;keywordTRUE | false;true |
4. 操作符
词法单元 | 记号 | 正则表达式 |
逗号 | operatorCOMMA | , |
分号 | operatorSEMICOLON | ; |
冒号 | operatorCOLON | : |
赋值号 | operatorASSIGN | := |
指针 | operatorPOINTER | ^ |
取址 | operatorADDRESS | @ |
加 | operatorADD | + |
减 | operatorSUB | - |
乘 | operatorMUL | * |
除 | operatorDIV | / |
左括号 | operatorLEFT | ( |
右括号 | operatorRIGHT | ) |
等于 | operatorEQUAL | = |
不等于 | operatorNOT_EQUAL | <> |
小于 | operatorLESS_THAN | < |
大于 | operatorLARGER_THAN | > |
小于等于 | operatorLESS_EQUAL_THAN | <= |
大于等于 | operatorLARGER_EQUAL_THAN | >= |
5. 注释:不能嵌套
正则表达式:{([^}])*}
三、语法
1. 类型
DataType → PrimitiveType | PointerType | FunctionType | VariableType
(1) 基本类型
PrimitiveType → keywordINTEGER | keywordREAL | keywordPBOOLEAN
(2) 指针类型
PointerType → PrimitiveType operatorPOINTER
如:integer^
(3) 函数类型
ParameterDeclaration → ID operatorCOLON DataType
ParameterDeclarationList →
(ParameterDeclaration (operatorSEMICOLON ParameterDeclaration)*) | EMPTY
a) 有返回值
FunctionType →
keywordFUNCTION Expression
operatorLEFT ParameterDeclarationList operatorRIGHT
operatorCOLON DataType
如:function GetValue(i:integer):integer
b) 无返回值
FunctionType →
keywordPROCEDURE Expression
operatorLEFT ParameterDeclarationList operatorRIGHT
如:procedure Run(i:integer; p:integer^)
(4) 变量类型
VariableType → ID
2. 变量声明:在全局区域或函数中
VariableDeclaration → keywordVAR (VariableDeclarationItem)+
VariableDeclarationItem →
VariableList operatorCOLON DataType operatorSEMICOLON
VariableList → ID (operatorCOMMA ID)*
如:var i,j:integer; p:boolean;
3. 表达式
Expression →
PrimitiveExpression | InvokeExpression | CastExpression | SizeOfExpression |
UnaryExpression | BinaryExpression
(1) 基本表达式
PrimitiveExpression → LiteralExpresssion | VariableExpression
a) 字面值表达式
A. 整数:LiteralExpresssion → valueINTEGER
如:123
B. 浮点数:LiteralExpresssion → valueREAL
如:12.3
C. 布尔值:LiteralExpresssion → keywordFALSE | keywordTRUE
如:true
b) 变量表达式:VariableExpression → ID
如:a
(2) 函数调用表达式
InvokeExpression → Expression operatorLEFT ArgumentList operatorRIGHT
ArgumentList → EMTPY | (Expression (operatorCOMMA Expression)*)
如:FunctionName(argument1, argument2)
(3) 强制转换表达式
CastExpression → DataType operatorLEFT Expression operatorRIGHT
如:data指针平移一个整数距离integer^(integer(data)+sizeof(integer))
注:指针无法加减,只能强制转换成整数
(4) sizeof表达式
SizeOfExpression →
keywordSIZE_OF operatorLEFT (Expression | DataType) operatorRIGHT
如:sizeof(integer)
(5) 一元表达式
a) not:UnaryExpression → keywordNOT Expression
如:not true
b) 取址:UnaryExpression → operatorADDRESS Expression
如:@pointer
c) 取指针指向的值:UnaryExpression → Expression operatorPOINTER
如:pointer^
(6) 二元表达式
BinaryExpression → OrExpression
OrExpression → AndExpression (keywordOR AndExpression)*
AndExpression → RelationExpression (keywordAND RelationExpression )*
RelationExpression →
AddSubExpression ((operatorLESS | operatorLARGER | operatorLESS_THAN |
operator LARGER_THAN | operatorEQUAL | operator NOT_EQUAL) Expression)*
AddSubExpression →
MulDivExpression ((operatorADD | operatorSUB) AddSubExpression)*
MulDivExpression →
UnaryExpression ((operatorMUL | operatorDIV) UnaryExpression)*
SimpleExpression →
PrimitiveExpression | InvokeExpression | UnaryExpression |
operatorLEFT Expression operatorRIGHT
如:IsAvailable() and (1+2)/3 = 1
(7) 操作符优先级(由低到高):括号可以改变优先级
1 | or |
2 | and |
3 | < > <= >= = <> |
4 | + - |
5 | * / |
6 | not -(一元) |
7 | @ |
4. 语句
Statement →
ExpressionStetement | AssignStatement | ReturnStatement | IfStatement |
WhileStatement | RepeatStatement | ControlStatement | BlockStatement
(1) 表达式语句
ExpressionStatement → Expression operatorSEMICOLON
如:Run();
(2) 赋值语句
AssignStatement → Expression operatorASSIGN Expression operatorSEMICOLON
如: pointer^ = 1;
(3) return语句
a) function
ReturnStatement → keywordRETURN Expression operatorSEMICOLON
如:return true;
b) procedure:ReturnStatement → keywordRETURN operatorSEMICOLON
(4) if语句
IfStatement →
keywordIF operatorLEFT Expression operatorRIGHT
keywordTHEN Statement
(keywordELSE Statement)?
如:if (true) then DoSomething(); else DoSomethingElse();
(5) while语句
WhileStatement →
keywordWHILE operatorLEFT Expression operatorRIGHT keywordDO
Statement
如:while (IsAvailable()) do DoSomething();
(6) repeat语句
RepeatStatement →
keywordREPEAT Statement
keywordUNTIL operatorLEFT Expression operatorRIGHT operatorSEMICOLON
如:repeat DoSomething(); until (IsAvailable());
(7) 控制语句
ControlStatement →(keywordBREAK | keywordCONTINUE) operatorSEMICOLON
(8) 语句块
BlockStatement →
keywordBEGIN (Statement)* keywordEND operatorSEMICOLON
如:begin DoSomething(); DoSomethingElse(); end;
a) 由begin和end包围,可包围0个或以上语句
b) 可以嵌套
c) 在其所在层次上被视为一个语句
5. 函数定义
函数定义不能嵌套,只能在全局区域
FunctionProcedure → FunctionType (VariableDeclaration | EMPTY) BlockStatement
如:
(1) function Fun1(Param1:integer;Param2:integer):boolean
var i,j:integer; k:real;
begin
{函数体}
end
(2) procedure Fun2()
begin
{函数体}
end