/SNL

Compiler Project, building tokenizer, parser for SNL lanugage

Primary LanguagePython

SNL编译原理实验

windows 用户请使用 powershell , 否则可能部分功能无法正常使用

演示方法

python main.py program/program2.snl , 依次进行词法分析,语法分析,语义分析。

词法分析器 Tokenizer.py

CL

  • program.snl : 源代码
  • program.snl.tmp : 预处理后的代码
  • program.snl.tok : 生成的token序列

Tokenizer.py 使用:

python Tokenizer.py program.snl

语法分析器

  • 使用Tokeniezer.Token 的unserilze方法将字符串恢复成Token对象

递归下降法 RecursiveParser.py

CL

  • 使用词法分析后的.tok文件 RecursiveParser.py 使用:
python RecursiveParser.py temp.tok
  • 输出中绿色和红色代表终结符,其中红色代表变量标识符 ; 黑色代表非终结符

  • 语法树结构保存于.ptree文件中用于后续语义分析,使用pickle进行反序列化操作

  • 生成语法树图中,绿色代表终结符节点

样例(temp.tok)的语法树

语法树图

命令行输出版

ROOT
--Program
----ProgramHead
------PROGRAM
------ProgramName
--------p
----DeclarePart
------TypeDecpart
--------TypeDec
----------TYPE
----------TypeDecList
------------TypeID
--------------t1
------------EQUAL
------------TypeDef
--------------BaseType
----------------INTEGER
------------SEMICOLON
------------TypeDecMore
--------------TypeDecList
----------------TypeID
------------------t2
----------------EQUAL
----------------TypeDef
------------------BaseType
--------------------CHAR
----------------SEMICOLON
----------------TypeDecMore
------------------TypeDecList
--------------------TypeID
----------------------t3
--------------------EQUAL
--------------------TypeDef
----------------------ArrayType
------------------------ARRAY
------------------------LB
------------------------Low
--------------------------1
------------------------RANGE
------------------------Top
--------------------------20
------------------------RB
------------------------OF
------------------------BaseType
--------------------------INTEGER
--------------------SEMICOLON
--------------------TypeDecMore
------VarDecpart
--------VarDec
----------VAR
----------VarDecList
------------TypeDef
--------------BaseType
----------------INTEGER
------------VarIdList
--------------v1
--------------VarIdMore
----------------COMMA
----------------VarIdList
------------------v2
------------------VarIdMore
------------SEMICOLON
------------VarDecMore
------ProcDecpart
--------ProcDec
----------PROCEDURE
----------ProcName
------------q
----------LP
----------ParamList
------------ParamDecList
--------------Param
----------------TypeDef
------------------BaseType
--------------------INTEGER
----------------FormList
------------------i
------------------FidMore
--------------ParamMore
----------RP
----------SEMICOLON
----------ProcDecPart
------------DeclarePart
--------------TypeDecpart
--------------VarDecpart
----------------VarDec
------------------VAR
------------------VarDecList
--------------------TypeDef
----------------------BaseType
------------------------INTEGER
--------------------VarIdList
----------------------a
----------------------VarIdMore
--------------------SEMICOLON
--------------------VarDecMore
--------------ProcDecpart
----------ProcBody
------------ProgramBody
--------------BEGIN
--------------StmList
----------------Stm
------------------a
------------------AssCall
--------------------AssignmentRest
----------------------VariMore
----------------------ASSIGN
----------------------Exp
------------------------Term
--------------------------Factor
----------------------------Variable
------------------------------i
------------------------------VariMore
--------------------------OtherFactor
------------------------OtherTerm
----------------StmMore
------------------SEMICOLON
------------------StmList
--------------------Stm
----------------------OutputStm
------------------------WRITE
------------------------LP
------------------------Exp
--------------------------Term
----------------------------Factor
------------------------------Variable
--------------------------------a
--------------------------------VariMore
----------------------------OtherFactor
--------------------------OtherTerm
------------------------RP
--------------------StmMore
--------------END
----------ProcDecMore
----ProgramBody
------BEGIN
------StmList
--------Stm
----------InputStm
------------READ
------------LP
------------Invar
--------------v1
------------RP
--------StmMore
----------SEMICOLON
----------StmList
------------Stm
--------------ConditionalStm
----------------IF
----------------RelExp
------------------Exp
--------------------Term
----------------------Factor
------------------------Variable
--------------------------v1
--------------------------VariMore
----------------------OtherFactor
--------------------OtherTerm
------------------OtherRelE
--------------------CmpOp
----------------------ST
--------------------Exp
----------------------Term
------------------------Factor
--------------------------10
------------------------OtherFactor
----------------------OtherTerm
----------------THEN
----------------StmList
------------------Stm
--------------------v1
--------------------AssCall
----------------------AssignmentRest
------------------------VariMore
------------------------ASSIGN
------------------------Exp
--------------------------Term
----------------------------Factor
------------------------------Variable
--------------------------------v1
--------------------------------VariMore
----------------------------OtherFactor
--------------------------OtherTerm
----------------------------AddOp
------------------------------PLUS
----------------------------Exp
------------------------------Term
--------------------------------Factor
----------------------------------10
--------------------------------OtherFactor
------------------------------OtherTerm
------------------StmMore
----------------ELSE
----------------StmList
------------------Stm
--------------------v1
--------------------AssCall
----------------------AssignmentRest
------------------------VariMore
------------------------ASSIGN
------------------------Exp
--------------------------Term
----------------------------Factor
------------------------------Variable
--------------------------------v1
--------------------------------VariMore
----------------------------OtherFactor
--------------------------OtherTerm
----------------------------AddOp
------------------------------MINUS
----------------------------Exp
------------------------------Term
--------------------------------Factor
----------------------------------10
--------------------------------OtherFactor
------------------------------OtherTerm
------------------StmMore
----------------FI
------------StmMore
--------------SEMICOLON
--------------StmList
----------------Stm
------------------q
------------------AssCall
--------------------CallStmRest
----------------------LP
----------------------ActParamList
------------------------Exp
--------------------------Term
----------------------------Factor
------------------------------Variable
--------------------------------v1
--------------------------------VariMore
----------------------------OtherFactor
--------------------------OtherTerm
------------------------ActParamMore
----------------------RP
----------------StmMore
------END
----END_PROGRAM

非递归法

XWK

语义分析器

实现的语义规则:

- 变量先声明,再使用 , 可以使用父作用域内声明的变量,不能使用子作用域内声明的变量
- 相同作用域不允许重复声明同名变量
- 使用双向多叉树实现

SA.PY 使用方法