直譯器構造文法簡述
本文法是在CMM文法的基礎上做了函式呼叫,邏輯運算以及陣列運算,以及struct的定義,類的定義
:
首先說明一下樹節點所應該包含的資訊,分別包含了:
節點的型別,當前token的所有資訊,int值,real值,陣列維數,最重要的是孩子節點指標,這裡用一個連結串列表示所有的孩子。你也可以加上行號,以及其他的資訊。
入口是start_STMT.從這個根節點下,它的孩子是class定義的節點和struct定義的節點。(^ is null)
START_STMT------->CLASS_STMT | STRUCT_STMT
CLASS_STMT------->class { CLASS_BODY_SEQ }
CLASS_BODY_SEQ------->CLASS_BODY_SEQ CLASS_BODY_STMT | ^
CLASS_BODY_STMT------->FUNC_STMT | DEC_STMT
STRUCT_STMT------->struct { STRUCT_BODY }
STRUCT_BODY------->STRUCT_BODY DEC_STMT | DEC_STMT
FUNC_STMT------->FUNC_TYPE ID ( PARA_STMT_SEQ ) { STMT_SEQ }
FUNC_TYPE------->void | int | real | bool
ID------->[a-zA-Z$_]+(a-zA-Z$_0-9)*
PARA_STMT_SEQ------->PARA_STMT_SEQ [,PARA_DEC] | PARA_DEC
PARA_DEC------->TYPE DIMEN_DESC ID
TYPE------->int | real | bool
DIMEN_DESC------->DIMEN_DESC [] | []
STMT_SEQ------->{ STMT_SEQ_BODY }
STMT_SEQ_BODY------->STMT_SEQ_BODY | STMT
STMT------->DEC_STMT | IF_STMT | WHILE_STMT | READ_STMT | WRITE_STMT | RETURN_STMT | CALL_STMT | ASSIGN_STMT | SELF_STMT
DEC_STMT------->TYPE ID DEC_STMT_SUB;
DEC_STMT_SUB------->[=EXP] | DIMEN_SEQ
DIMEN_SEQ------->DIMEN_SEQ[AEXP] | [AEXP]
IF_STMT------->IF( EXP ) STMT_PART [ELSE STMT_PART];
STMT_PART------->STMT | STMT_SEQ
WHILE_STMT------->WHILE (EXP) STMT_SEQ;
READ_STMT------->READ ID [DIMEN_SEQ];
WRITE_STMT------->WRITE EXP;
RETURN_STMT------->RETURN EXP;
CALL_STMT------->ID ( PARA_CALL_SEQ );
PARA_CALL_SEQ------->PARA_CALL_SEQ [,EXP] | EXP
ASSIGN_STMT------->ID [DIMEN_SEQ] = EXP;
SELF_STMT------->SELFOP ID[DIMEN_SEQ] | ID[DIMEN_SEQ] SELFOP;
SELFOP------->++ | --
EXP------->OR
OR------->AND[|| OR]
AND------->NOT [|| AND]
NOT------->^NOT | EQEXP | CONSTBOOL
EQEXP------->AEXP EOP AEXP
EOP------->< | <= | > | >= | == | !=
AEXP------->TEXP AOP TEXP
AOP------->+ | -
TEXP------->UNAEXP TOP UNAEXP
TOP------->* | / | %
UNAEXP------->[POP] ELEMENT | ELEMENT [SELFOP]
POP------->SELFOP | -
ELEMENT------->CONST | ID2 | ( EXP )
:
首先說明一下樹節點所應該包含的資訊,分別包含了:
節點的型別,當前token的所有資訊,int值,real值,陣列維數,最重要的是孩子節點指標,這裡用一個連結串列表示所有的孩子。你也可以加上行號,以及其他的資訊。
入口是start_STMT.從這個根節點下,它的孩子是class定義的節點和struct定義的節點。(^ is null)
START_STMT------->CLASS_STMT | STRUCT_STMT
CLASS_STMT------->class { CLASS_BODY_SEQ }
CLASS_BODY_SEQ------->CLASS_BODY_SEQ CLASS_BODY_STMT | ^
CLASS_BODY_STMT------->FUNC_STMT | DEC_STMT
STRUCT_STMT------->struct { STRUCT_BODY }
STRUCT_BODY------->STRUCT_BODY DEC_STMT | DEC_STMT
FUNC_STMT------->FUNC_TYPE ID ( PARA_STMT_SEQ ) { STMT_SEQ }
FUNC_TYPE------->void | int | real | bool
ID------->[a-zA-Z$_]+(a-zA-Z$_0-9)*
PARA_STMT_SEQ------->PARA_STMT_SEQ [,PARA_DEC] | PARA_DEC
PARA_DEC------->TYPE DIMEN_DESC ID
TYPE------->int | real | bool
DIMEN_DESC------->DIMEN_DESC [] | []
STMT_SEQ------->{ STMT_SEQ_BODY }
STMT_SEQ_BODY------->STMT_SEQ_BODY | STMT
STMT------->DEC_STMT | IF_STMT | WHILE_STMT | READ_STMT | WRITE_STMT | RETURN_STMT | CALL_STMT | ASSIGN_STMT | SELF_STMT
DEC_STMT------->TYPE ID DEC_STMT_SUB;
DEC_STMT_SUB------->[=EXP] | DIMEN_SEQ
DIMEN_SEQ------->DIMEN_SEQ[AEXP] | [AEXP]
IF_STMT------->IF( EXP ) STMT_PART [ELSE STMT_PART];
STMT_PART------->STMT | STMT_SEQ
WHILE_STMT------->WHILE (EXP) STMT_SEQ;
READ_STMT------->READ ID [DIMEN_SEQ];
WRITE_STMT------->WRITE EXP;
RETURN_STMT------->RETURN EXP;
CALL_STMT------->ID ( PARA_CALL_SEQ );
PARA_CALL_SEQ------->PARA_CALL_SEQ [,EXP] | EXP
ASSIGN_STMT------->ID [DIMEN_SEQ] = EXP;
SELF_STMT------->SELFOP ID[DIMEN_SEQ] | ID[DIMEN_SEQ] SELFOP;
SELFOP------->++ | --
EXP------->OR
OR------->AND[|| OR]
AND------->NOT [|| AND]
NOT------->^NOT | EQEXP | CONSTBOOL
EQEXP------->AEXP EOP AEXP
EOP------->< | <= | > | >= | == | !=
AEXP------->TEXP AOP TEXP
AOP------->+ | -
TEXP------->UNAEXP TOP UNAEXP
TOP------->* | / | %
UNAEXP------->[POP] ELEMENT | ELEMENT [SELFOP]
POP------->SELFOP | -
ELEMENT------->CONST | ID2 | ( EXP )
ID2------->ID [DIMEN_SEQ] | ID (PARA_CALL_SEQ)
以上便是涉及到的所有文法。實現採用自頂向下分析方法。
相關文章
- 簡說設計模式——直譯器模式設計模式
- 極簡設計模式-直譯器模式設計模式
- 化繁為簡的翻譯機——直譯器模式模式
- 精讀《手寫 SQL 編譯器 - 文法介紹》SQL編譯
- 精讀《手寫 SQL 編譯器 – 文法介紹》SQL編譯
- Ipython 直譯器Python
- Kubernetes架構簡述架構
- 直譯器模式(Interpreter)模式
- python直譯器在哪Python
- 簡易C語言文法分析C語言
- 淺談彙編器、編譯器和直譯器編譯
- 24_直譯器模式模式
- VScode和python直譯器VSCodePython
- Python3 直譯器Python
- Python直譯器和IPythonPython
- 構造器
- 瀏覽器渲染簡述瀏覽器
- Verilog 過程結構簡述
- 使用 Laravel Eloquent 構造器讓模型更簡潔Laravel模型
- Java--構造器和構造方法Java構造方法
- 源語言、目標語言、翻譯器、編譯器、直譯器編譯
- python直譯器的安裝Python
- 設計模式(十五)直譯器設計模式
- Python直譯器有幾種Python
- cmd.exe直譯器漏洞
- java構造器Java
- 簡述常見資料結構資料結構
- 日曆(設計構造器與預設構造器)
- 什麼是Python全域性直譯器鎖(GIL)?全域性直譯器鎖的好處!Python
- [編譯原理]如何判斷某文法的二義性以及找到文法對應的語言編譯原理
- 簡述交叉編譯常用的方法及在構建Docker映象中的應用編譯Docker
- 設計模式之直譯器模式設計模式
- Python與全域性直譯器鎖Python
- Python GIL(全域性直譯器鎖)Python
- Python直譯器分類有哪些?Python
- 14.構造器
- (譯)Effective Kotlin系列之遇到多個構造器引數要考慮使用構建器(二)Kotlin
- 【lombok】@NoArgsConstructor/@RequirArgsConstructor/@AllArgsConstructor - 生成無參構造器,指定引數構造器或包含所有引數的構造器LombokStructUI
- 文法分析