parent
7565bcbde4
commit
b133373471
@ -1,27 +1,25 @@
|
|||||||
const a=10;
|
const a=10;
|
||||||
var b,c;
|
var b,c,e;
|
||||||
procedure p;
|
procedure p;
|
||||||
var d;
|
var d;
|
||||||
begin
|
begin
|
||||||
d:=20;
|
d:=20;
|
||||||
write(d);
|
|
||||||
c:=d/a;
|
c:=d/a;
|
||||||
write(c);
|
|
||||||
c:=c+b;
|
c:=c+b;
|
||||||
write(c);
|
|
||||||
if a<c then c:=c*2;
|
if a<c then c:=c*2;
|
||||||
write(c);
|
write(c);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
read (b);
|
read (b);
|
||||||
while b#0 do
|
while b#0 do
|
||||||
begin
|
begin
|
||||||
|
e := b;
|
||||||
|
e := 4*e/2/3+(3*1);
|
||||||
call p;
|
call p;
|
||||||
write(c);
|
write(e);
|
||||||
read(b);
|
read(b);
|
||||||
b := 4*b/2/3+(3*1);
|
|
||||||
write(b);
|
|
||||||
end;
|
end;
|
||||||
b:=1;
|
b:=999999999;
|
||||||
write(b);
|
write(b);
|
||||||
end.
|
end.
|
@ -1,12 +1,31 @@
|
|||||||
# BadassPascal
|
# AwesomePascal
|
||||||
### This code came from my undergrad course project for compiler principles in 2015, although I did minimum bug fixes on this recently, this code still can not be considered as efficient nor even readible by any means because a lot of hacks were used to make it work and the writing doesn't confrom to a stable coding style either. However, it is something that I was proud of at that time.
|
|
||||||
|
Another PL/0 language (https://en.wikipedia.org/wiki/PL/0) compiler and debugger that is written in C++.
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This code came from my undergrad course project for compiler principles in 2015. The code quality is beyond horrible but it's some of my earliest big projects.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
- The compiler uses **SLR(1)** parsing. The grammar is hard-coded in the form of an LR parsing table (`states`) and the FOLLOW set (`follows`) which is initialized in `initStates()` function.
|
||||||
|
- The compiler was written from the ground up **without any third-party libraries** except the standard C++ library.
|
||||||
|
- It contains:
|
||||||
|
- A lexer (`GETSYM()` function) that processes the input into tokens and literals while constructing a symbol table
|
||||||
|
- A parser (`BLOCK()` function) that uses shift/reduce-parsing to generate the target code (pseudo-assembly)
|
||||||
|
- An interpreter (`INTERPRET()` function) that executes the pseudo-assembly code.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
Another PL/0 language (https://en.wikipedia.org/wiki/PL/0) compiler and debugger written in C++.
|
|
||||||
|
|
||||||
Supported Environments:
|
Supported Environments:
|
||||||
MSVC project: BadassPascal.sln
|
- MSVC project: AwesomePascal.vcxproj
|
||||||
GNU C++/Clang: compile BadassPascal.cpp directly
|
- GNU C++/Clang: compile AwesomePascal.cpp directly
|
||||||
>e.g.
|
|
||||||
>`$ g++ -O3 BadassPascal.cpp -o BP`
|
## Examples
|
||||||
|
- InsertionSort.pas: A simple program that takes 5 integers and sorts them in descending order.
|
||||||
|
- NumericExpr.pas: A simple program that contains numerical expressions and control flow.
|
||||||
|
-
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
>`$ g++ -O3 -DNDEBUG AwesomePascal.cpp -o BP`
|
||||||
>`$ ./BP InsersionSort.pas`
|
>`$ ./BP InsersionSort.pas`
|
||||||
|
|
||||||
|
Loading…
Reference in new issue