SimplePascal Grammar Lyt
一、簡介
1. 數據類型:整型integer、浮點型real、布爾型boolean、指針、pointer(相當于C++中void*)
2. 有且只有一個main函數,從調用main函數開始執(zhí)行程序
3. 大小寫不敏感
二、詞法
1. 關鍵字
|
詞法單元 |
記號 |
說明 |
|
function |
keywordFUNCTION |
函數(有返回值) |
|
procedure |
keywordPROCEDURE |
函數(無返回值) |
|
var |
keywordVAR |
聲明變量 |
|
result |
keywordRESULT |
函數的返回值 |
|
integer |
keywordINTEGER |
整型 |
|
real |
keywordREAL |
浮點型 |
|
boolean |
keywordBOOLEAN |
布爾型 |
|
pointer |
keywordPOINTER |
相當于C++中void* |
|
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 |
獲得某類型字節(jié) |
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 → keywordPOINTER |
DataType
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^)
2. 表達式
Expression →
PrimitiveExpression
| InvokeExpression | CastExpression | SizeOfExpression |
ResultExpression
| 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) result表達式
ResultExpression
→ keywordRESULT
(6) 一元表達式
a) not:UnaryExpression → keywordNOT Expression
如:not true
b) 取址:UnaryExpression → operatorADDRESS Expression
如:@pointer
c) 取指針指向的值:UnaryExpression → Expression operatorPOINTER
如:pointer^
(7) 二元表達式
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
(8) 操作符優(yōu)先級(由低到高):括號可以改變優(yōu)先級
|
1 |
or |
|
2 |
and |
|
3 |
< > <= >= = <> |
|
4 |
+ - |
|
5 |
* / |
|
6 |
not -(一元) |
|
7 |
@ |
3. 語句
Statement →
ExpressionStetement
| AssignStatement | IfStatement |
WhileStatement
| RepeatStatement | ControlStatement | BlockStatement
(1) 表達式語句
ExpressionStatement → Expression operatorSEMICOLON
如:Run();
(2) 賦值語句
AssignStatement → Expression operatorASSIGN Expression operatorSEMICOLON
如: pointer^ = 1;
(3) if語句
IfStatement →
keywordIF operatorLEFT Expression
operatorRIGHT
keywordTHEN Statement
(keywordELSE Statement)?
如:if (true) then DoSomething(); else DoSomethingElse();
(4) while語句
WhileStatement →
keywordWHILE
operatorLEFT Expression operatorRIGHT keywordDO
Statement
如:while (IsAvailable()) do DoSomething();
(5) repeat語句
RepeatStatement →
keywordREPEAT Statement
keywordUNTIL operatorLEFT Expression
operatorRIGHT operatorSEMICOLON
如:repeat DoSomething(); until (IsAvailable());
(6) 控制語句
ControlStatement →(keywordBREAK | keywordCONTINUE) operatorSEMICOLON
(7) 語句塊
BlockStatement →
keywordBEGIN (Statement)*
keywordEND operatorSEMICOLON
如:begin DoSomething();
DoSomethingElse(); end;
a) 由begin和end包圍,可包圍0個或以上語句
b) 可以嵌套
c) 在其所在層次上被視為一個語句
4. 函數定義
函數定義不能嵌套,只能在全局區(qū)域
FunctionProcedure → FunctionHead (VariableDeclaration | EMPTY) BlockStatement
(1) 函數頭
ParameterDeclaration → ID operatorCOLON DataType
ParameterDeclarationList →
(ParameterDeclaration (operatorSEMICOLON ParameterDeclaration)*) |
EMPTY
a)
有返回值
FunctionHead →
keywordFUNCTION Expression
operatorLEFT ParameterDeclarationList
operatorRIGHT
operatorCOLON
DataType
如:function GetValue(i:integer):integer
b)
無返回值
FunctionHead →
keywordPROCEDURE Expression
operatorLEFT ParameterDeclarationList
operatorRIGHT
如:procedure Run(i:integer; p:integer^)
(2) 變量聲明:只能在函數中
VariableDeclaration → keywordVAR (VariableDeclarationItem)+
VariableDeclarationItem →
VariableList operatorCOLON DataType operatorSEMICOLON
VariableList → ID (operatorCOMMA ID)*
如:var i,j:integer; p:boolean;
函數定義如:
(1)
function
Fun1(Param1:integer;Param2:integer):boolean
var i,j:integer; k:real;
begin
{函數體}
end
(2)
procedure
Fun2()
begin
{函數體}
end

