编译原理实验

PASCAL语言子集(PL/0)语法分析器

Input

输入。

词法分析结果文件 la_output

注释格式:

# 我是一条注释
我不是注释

词法错误:

^ 错误内容
错误输出

输入样例:见词法分析器的输出样例

Output

输出。

字符流输出。

输出样例:

[Lexical ERROR]  [2,12] Invalid ID: "3er"
[Lexical ERROR]  [2,15] Missing "=" near the ":" ;
[Grammar ERROR]  [1,5] Missing word "program"
[Grammar ERROR]  [1,6] Missing identifier after "program"
[Grammar ERROR]  [2,10] Missing end character ";"
[Grammar ERROR]  [2,14] Cannot resolve type "3er"
[Grammar ERROR]  [3,7] Cannot resolve type "va"
[Grammar ERROR]  [7,22] Missing word "do"

Error Warning

错误提示。

Keyword Error

关键字错误。

关键字 丢失 拼写错误
program   supported
const   supported
var   supported
procedure   supported
begin supported  
if    
then supported  
while    
do supported  
call    
read    
write    
end supported  

Identifier Error

标识符错误。

区域 丢失 拼写错误
program supported supported
const supported supported
var supported supported
procedure supported supported
read supported supported

Type Error

类型错误。

类型 拼写错误
const supported
var supported

Character Error

符号错误。

区域 符号 丢失
program ; supported
const := supported
  , supported
  ; supported
var , supported
  ; supported
procedure ( supported
  ) supported
  ; supported
read ( supported
  ) supported
write ( supported
  ) supported

Unknown Error

未知错误。

PASCAL语言子集(PL/0)词法分析器

Input

输入。

使用 PL/0 编写的源程序。

输入样例:

progam hhh;
    const er:3, te:=a, tt:=3;
    vr hhh;
begin
    aaa:=26;
end

Output

输出。

词法分析结果文件 la_output

输出样例:

# Lexical Analysis Result
# Generate Time: Fri Sep 29 18:40:39 2017
# Program File Name: input
# Language Set: PL/0

progam ID 1 7
hhh ID 1 11
; EOP 1 12
const RESERVED 2 10
er ID 2 13
^ := AOP 2 14
[Lexical ERROR] [2,14] Missing "=" near the ":" ;
3 INT 2 15
, SOP 2 16
te ID 2 19
:= AOP 2 21
a ID 2 22
, SOP 2 23
tt ID 2 26
:= AOP 2 28
3 INT 2 29
; EOP 2 30
vr ID 3 7
hhh ID 3 11
; EOP 3 12
begin RESERVED 4 6
aaa ID 5 8
:= AOP 5 10
26 INT 5 12
; EOP 5 13
end RESERVED 6 4

Keyword

关键字。

program , const , var , procedure , begin , if , then , while , call , read , write , end , do .

COP(Compare Operators)

比较符。

= , <> , < , <= , > , >=

AOP(Assignment Operator)

赋值符。

:=

OOP(Operation Operators)

操作符。

* , / , + , -

EOP(End Operator)

结束符。

;

SOP(Sperate Operators)

分隔符。

( , ) , ,

Error Warning

错误提示。

PASCAL语言子集(PL/0)文法

<prog> → program <id>; <block>
<block> → [<condecl>][<vardecl>][<proc>]<body>
<condecl> → const <const>{,<const>}; // 可以是一个集合
<const> → <id>:=<integer> 
<vardecl> → var <id>{,<id>};
<proc> → procedure <id>(<id>{,<id>});<block>{;<proc>}
<body> → begin <statement>{;<statement>}end
<statement> → <id> := <exp>
               |if <lexp> then <statement>[else <statement>]
               |while <lexp> do <statement>
               |call <id>[(<exp>{,<exp>})]
               |<body>
               |read (<id>{,<id>})
               |write (<exp>{,<exp>})
<lexp> → <exp> <lop> <exp>|odd <exp>
<exp> → [+|-]<term>{<aop><term>}
<term> → <factor>{<mop><factor>}
<factor>→<id>|<integer>|(<exp>)
<lop> → =|<>|<|<=|>|>=
<aop> → +|-
<mop> → *|/
<id> → l{l|d}   (注:l表示字母)
<integer> → d{d}

版权信息。

Copyright © 2017 TripleZ

MIT License