SimplePascal Grammar
Lyt
一、簡介
1.
數據類型:整型integer、浮點型real、布爾型boolean、指針、pointer(相當于C++中void*)
2.
有且只有一個main函數,從調用main函數開始執行程序
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
|
獲得某類型字節
|
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)
操作符優先級(由低到高):括號可以改變優先級
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.
函數定義
函數定義不能嵌套,只能在全局區域
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