使用 LR(1)法進行語法分析。
根據 C 語言的文法生成 action 表和 goto 表,利用 action 表和 goto 表對詞法分析的輸出進行語法分析,構建語法樹。
要求:給出如下語言成分的文法描述。
Defination -> Type Point id
Type -> int | float | bool | id | double | Type [ const ]
Point -> epsilon | *
Struct -> struct id { Statement }
Statement -> Defination ; | Defination ; Statement
Function -> Type Point id ( Parameter ) { Process }
Parameter -> epsilon | Defination | Defination , Parameter
Process -> Module Return
Return -> return id Index ; | return Index ; | epsilon
Assignment -> id Index = Value
Value -> Value + Value | Value - Value | Value * Value | Value / Value | Call
Value -> - Value
Value -> ( Value )
Value -> const | id Index
Index -> [ Value ] Index | epsilon
Control -> If | If_Else | While
If -> if ( Condition ) { Module }
If_Else -> if ( Condition ) { Module } else { Module }
While -> while ( Condition ) { Module }
Condition -> Condition and Condition | Condition or Condition | not Condition | ( Condition ) | Value Relop Value | true | false
Relop -> < | <= | == | != | > | >=
Call -> id ( Transmit )
Transmit -> epsilon | Value | Value , Transmit
要求:分為系統概要設計和系統詳細設計。
(1) 系統概要設計:給出必要的系統宏觀層面設計圖,如系統框架圖、數據流圖、功能模塊結構圖等以及相應的文字說明。
程序主要由幾部分組成
(2) 系統詳細設計:對如下工作進行展開描述
用於儲存詞法分析的結果,保存詞法分析後的值、種類和行數。
要求:對如下內容展開描述。
附件 action.txt 與 goto.txt
測試程序
輸出結果:
Module (1)
Function (1)
Type (1)
int (1)
Point (1)
id : sum (1)
( (1)
Parameter (1)
Defination (1)
Type (1)
float (1)
Point (1)
id : a (1)
, (1)
Parameter (1)
Defination (1)
Type (1)
int (1)
Point (1)
id : b (1)
) (1)
{ (1)
Process (2)
Module (2)
Defination (2)
Type (2)
float (2)
Point (2)
id : ans (2)
; (2)
Module (3)
Assignment (3)
id : ans (3)
Index (3)
= (3)
Value (3)
Value (3)
id : a (3)
Index (3)
+ (3)
Value (3)
id : b (3)
Index (3)
; (3)
Module (3)
Return (4)
return (4)
id : ans (4)
Index (4)
; (4)
} (5)
Module (7)
Struct (7)
struct (7)
id : student (7)
{ (7)
Statement (8)
Defination (8)
Type (8)
int (8)
Point (8)
id : x (8)
; (8)
Statement (9)
Defination (9)
Type (9)
int (9)
Point (9)
id : y (9)
; (9)
} (10)
Module (12)
Defination (12)
Type (12)
int (12)
Point (12)
id : a (12)
; (12)
Module (13)
Defination (13)
Type (13)
Type (13)
int (13)
[ (13)
const : 3 (13)
] (13)
Point (13)
id : b (13)
; (13)
Module (14)
Defination (14)
Type (14)
int (14)
Point (14)
id : c (14)
; (14)
Module (15)
Defination (15)
Type (15)
int (15)
Point (15)
id : f (15)
; (15)
Module (16)
Defination (16)
Type (16)
int (16)
Point (16)
* (16)
id : k (16)
; (16)
Module (18)
Assignment (18)
id : a (18)
Index (18)
= (18)
Value (18)
const : 1 (18)
; (18)
Module (19)
Assignment (19)
id : b (19)
Index (19)
[ (19)
Value (19)
const : 0 (19)
] (19)
Index (19)
= (19)
Value (19)
const : 1 (19)
; (19)
Module (20)
Assignment (20)
id : c (20)
Index (20)
= (20)
Value (20)
Value (20)
id : a (20)
Index (20)
+ (20)
Value (20)
id : b (20)
Index (20)
[ (20)
Value (20)
const : 0 (20)
] (20)
Index (20)
; (20)
Module (21)
Assignment (21)
id : f (21)
Index (21)
= (21)
Value (21)
Call (21)
id : sum (21)
( (21)
Transmit (21)
Value (21)
Value (21)
id : a (21)
Index (21)
+ (21)
Value (21)
id : b (21)
Index (21)
[ (21)
Value (21)
const : 0 (21)
] (21)
Index (21)
) (21)
; (21)
Module (23)
Control (23)
IfElse (23)
if (23)
( (23)
Condition (23)
Value (23)
id : a (23)
Index (23)
Relop (23)
== (23)
Value (23)
const : 0 (23)
) (23)
{ (23)
Module (24)
Assignment (24)
id : b (24)
Index (24)
[ (24)
Value (24)
const : 1 (24)
] (24)
Index (24)
= (24)
Value (24)
const : 1 (24)
; (24)
Module (24)
} (25)
else (25)
{ (25)
Module (26)
Assignment (26)
id : b (26)
Index (26)
[ (26)
Value (26)
const : 1 (26)
] (26)
Index (26)
= (26)
Value (26)
const : 0 (26)
; (26)
Module (26)
} (27)
Module (28)
Assignment (28)
id : a (28)
Index (28)
= (28)
Value (28)
const : 1 (28)
; (28)
Module (30)
Control (30)
While (30)
while (30)
( (30)
Condition (30)
Value (30)
id : f (30)
Index (30)
Relop (30)
< (30)
Value (30)
const : 4 (30)
) (30)
{ (30)
Module (31)
Assignment (31)
id : b (31)
Index (31)
[ (31)
Value (31)
const : 2 (31)
] (31)
Index (31)
= (31)
Value (31)
Value (31)
id : b (31)
Index (31)
[ (31)
Value (31)
const : 2 (31)
] (31)
Index (31)
+ (31)
Value (31)
const : 1 (31)
; (31)
Module (31)
} (32)
Module (30)
第 28 行出現錯誤,進行報錯
Syntax error at Line [28]:illegal ==
實驗結果正確無誤
const : 1 (31)
; (31)
Module (31)
} (32)
Module (30)
- 輸出針對此測試程序對應的語法錯誤報告;
第 28 行出現錯誤,進行報錯
```c++
Syntax error at Line [28]:illegal ==
實驗結果正確無誤