mirror of
https://github.com/yhirose/cpp-peglib.git
synced 2024-12-22 20:05:31 +00:00
Added LLVM support to PL/0 sample
This commit is contained in:
parent
7c24c30104
commit
7c1e1751d9
@ -69,5 +69,4 @@ add_subdirectory(example)
|
|||||||
|
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
add_subdirectory(lint)
|
add_subdirectory(lint)
|
||||||
add_subdirectory(language/pl0)
|
|
||||||
endif()
|
endif()
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
|
||||||
include_directories(../..)
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
add_compile_options(${cxx11_options} /W0)
|
|
||||||
else()
|
|
||||||
add_compile_options(${cxx11_options})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(pl0 pl0.cc)
|
|
@ -9,9 +9,16 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
||||||
|
#include "llvm/ExecutionEngine/GenericValue.h"
|
||||||
|
#include "llvm/ExecutionEngine/MCJIT.h"
|
||||||
|
#include "llvm/IR/IRBuilder.h"
|
||||||
|
#include "llvm/IR/ValueSymbolTable.h"
|
||||||
|
#include "llvm/Support/TargetSelect.h"
|
||||||
|
|
||||||
using namespace peg;
|
using namespace peg;
|
||||||
using namespace peg::udl;
|
using namespace peg::udl;
|
||||||
|
using namespace llvm;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -154,7 +161,8 @@ struct SymbolTable {
|
|||||||
|
|
||||||
static void constants(const shared_ptr<AstPL0> ast,
|
static void constants(const shared_ptr<AstPL0> ast,
|
||||||
shared_ptr<SymbolScope> scope) {
|
shared_ptr<SymbolScope> scope) {
|
||||||
// const <- ('CONST' __ ident '=' _ number(',' _ ident '=' _ number)* ';' _) ?
|
// const <- ('CONST' __ ident '=' _ number(',' _ ident '=' _ number)* ';'
|
||||||
|
// _)?
|
||||||
const auto& nodes = ast->nodes;
|
const auto& nodes = ast->nodes;
|
||||||
for (auto i = 0u; i < nodes.size(); i += 2) {
|
for (auto i = 0u; i < nodes.size(); i += 2) {
|
||||||
const auto& ident = nodes[i + 0]->token;
|
const auto& ident = nodes[i + 0]->token;
|
||||||
@ -224,7 +232,7 @@ struct SymbolTable {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Environment
|
* Interpreter
|
||||||
*/
|
*/
|
||||||
struct Environment {
|
struct Environment {
|
||||||
Environment(shared_ptr<SymbolScope> scope, shared_ptr<Environment> outer)
|
Environment(shared_ptr<SymbolScope> scope, shared_ptr<Environment> outer)
|
||||||
@ -263,9 +271,6 @@ struct Environment {
|
|||||||
map<string, int> variables;
|
map<string, int> variables;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Interpreter
|
|
||||||
*/
|
|
||||||
struct Interpreter {
|
struct Interpreter {
|
||||||
static void exec(const shared_ptr<AstPL0> ast,
|
static void exec(const shared_ptr<AstPL0> ast,
|
||||||
shared_ptr<Environment> env = nullptr) {
|
shared_ptr<Environment> env = nullptr) {
|
||||||
@ -312,8 +317,7 @@ struct Interpreter {
|
|||||||
|
|
||||||
static void exec_statement(const shared_ptr<AstPL0> ast,
|
static void exec_statement(const shared_ptr<AstPL0> ast,
|
||||||
shared_ptr<Environment> env) {
|
shared_ptr<Environment> env) {
|
||||||
// statement <- (assignment / call / statements / if / while / out /
|
// statement <- (assignment / call / statements / if / while / out / in)?
|
||||||
// in)?
|
|
||||||
if (!ast->nodes.empty()) {
|
if (!ast->nodes.empty()) {
|
||||||
exec(ast->nodes[0], env);
|
exec(ast->nodes[0], env);
|
||||||
}
|
}
|
||||||
@ -487,6 +491,359 @@ struct Interpreter {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LLVM
|
||||||
|
*/
|
||||||
|
struct LLVM {
|
||||||
|
LLVM() : builder_(context_) {
|
||||||
|
module_ = make_unique<Module>("pl0", context_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile(const shared_ptr<AstPL0> ast) {
|
||||||
|
InitializeNativeTarget();
|
||||||
|
InitializeNativeTargetAsmPrinter();
|
||||||
|
compile_libs();
|
||||||
|
compile_program(ast);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dump() { module_->dump(); }
|
||||||
|
|
||||||
|
static void exec(const shared_ptr<AstPL0> ast) {
|
||||||
|
LLVM compiler;
|
||||||
|
compiler.compile(ast);
|
||||||
|
// compiler.dump();
|
||||||
|
|
||||||
|
auto EE = EngineBuilder(std::move(compiler.module_)).create();
|
||||||
|
std::unique_ptr<ExecutionEngine> ExecutionEngineOwner(EE);
|
||||||
|
|
||||||
|
std::vector<GenericValue> noargs;
|
||||||
|
auto fn = EE->FindFunctionNamed("__main__");
|
||||||
|
auto ret = EE->runFunction(fn, noargs);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
LLVMContext context_;
|
||||||
|
IRBuilder<> builder_;
|
||||||
|
unique_ptr<Module> module_;
|
||||||
|
|
||||||
|
void compile_switch(const shared_ptr<AstPL0> ast) {
|
||||||
|
switch (ast->tag) {
|
||||||
|
case "assignment"_:
|
||||||
|
compile_assignment(ast);
|
||||||
|
break;
|
||||||
|
case "call"_:
|
||||||
|
compile_call(ast);
|
||||||
|
break;
|
||||||
|
case "statements"_:
|
||||||
|
compile_statements(ast);
|
||||||
|
break;
|
||||||
|
case "if"_:
|
||||||
|
compile_if(ast);
|
||||||
|
break;
|
||||||
|
case "while"_:
|
||||||
|
compile_while(ast);
|
||||||
|
break;
|
||||||
|
case "out"_:
|
||||||
|
compile_out(ast);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
compile_switch(ast->nodes[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_switch_value(const shared_ptr<AstPL0> ast) {
|
||||||
|
switch (ast->tag) {
|
||||||
|
case "odd"_:
|
||||||
|
return compile_odd(ast);
|
||||||
|
case "compare"_:
|
||||||
|
return compile_compare(ast);
|
||||||
|
case "expression"_:
|
||||||
|
return compile_expression(ast);
|
||||||
|
case "ident"_:
|
||||||
|
return compile_ident(ast);
|
||||||
|
case "number"_:
|
||||||
|
return compile_number(ast);
|
||||||
|
default:
|
||||||
|
return compile_switch_value(ast->nodes[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_libs() {
|
||||||
|
auto printfF = module_->getOrInsertFunction(
|
||||||
|
"printf",
|
||||||
|
FunctionType::get(builder_.getInt32Ty(),
|
||||||
|
PointerType::get(builder_.getInt8Ty(), 0), true));
|
||||||
|
|
||||||
|
auto outF = cast<Function>(module_->getOrInsertFunction(
|
||||||
|
"out", builder_.getVoidTy(), builder_.getInt32Ty(), nullptr));
|
||||||
|
{
|
||||||
|
auto BB = BasicBlock::Create(context_, "entry", outF);
|
||||||
|
builder_.SetInsertPoint(BB);
|
||||||
|
|
||||||
|
auto val = &*outF->arg_begin();
|
||||||
|
|
||||||
|
auto fmt = builder_.CreateGlobalStringPtr("%d\n");
|
||||||
|
std::vector<Value*> args = {fmt, val};
|
||||||
|
builder_.CreateCall(printfF, args);
|
||||||
|
|
||||||
|
builder_.CreateRetVoid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_program(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto fn = cast<Function>(module_->getOrInsertFunction(
|
||||||
|
"__main__", builder_.getVoidTy(), nullptr));
|
||||||
|
{
|
||||||
|
auto BB = BasicBlock::Create(context_, "entry", fn);
|
||||||
|
builder_.SetInsertPoint(BB);
|
||||||
|
compile_block(ast->nodes[0], true);
|
||||||
|
builder_.CreateRetVoid();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_block(const shared_ptr<AstPL0> ast, bool top) {
|
||||||
|
compile_const(ast->nodes[0], top);
|
||||||
|
compile_var(ast->nodes[1], top);
|
||||||
|
compile_procedure(ast->nodes[2]);
|
||||||
|
compile_statement(ast->nodes[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_const(const shared_ptr<AstPL0> ast, bool top) {
|
||||||
|
for (auto i = 0u; i < ast->nodes.size(); i += 2) {
|
||||||
|
auto ident = ast->nodes[i]->token;
|
||||||
|
auto number = stoi(ast->nodes[i + 1]->token);
|
||||||
|
|
||||||
|
if (top) {
|
||||||
|
auto gv = cast<GlobalVariable>(
|
||||||
|
module_->getOrInsertGlobal(ident, builder_.getInt32Ty()));
|
||||||
|
gv->setAlignment(4);
|
||||||
|
gv->setInitializer(builder_.getInt32(number));
|
||||||
|
} else {
|
||||||
|
auto alloca =
|
||||||
|
builder_.CreateAlloca(builder_.getInt32Ty(), nullptr, ident);
|
||||||
|
builder_.CreateStore(builder_.getInt32(number), alloca);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_var(const shared_ptr<AstPL0> ast, bool top) {
|
||||||
|
for (const auto node : ast->nodes) {
|
||||||
|
if (top) {
|
||||||
|
auto gv = cast<GlobalVariable>(
|
||||||
|
module_->getOrInsertGlobal(node->token, builder_.getInt32Ty()));
|
||||||
|
gv->setAlignment(4);
|
||||||
|
gv->setInitializer(builder_.getInt32(0));
|
||||||
|
} else {
|
||||||
|
builder_.CreateAlloca(builder_.getInt32Ty(), nullptr, node->token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_procedure(const shared_ptr<AstPL0> ast) {
|
||||||
|
for (auto i = 0u; i < ast->nodes.size(); i += 2) {
|
||||||
|
auto ident = ast->nodes[i]->token;
|
||||||
|
auto block = ast->nodes[i + 1];
|
||||||
|
|
||||||
|
auto fn = cast<Function>(
|
||||||
|
module_->getOrInsertFunction(ident, builder_.getVoidTy(), nullptr));
|
||||||
|
{
|
||||||
|
auto prevBB = builder_.GetInsertBlock();
|
||||||
|
auto BB = BasicBlock::Create(context_, "entry", fn);
|
||||||
|
builder_.SetInsertPoint(BB);
|
||||||
|
compile_block(block, false);
|
||||||
|
builder_.CreateRetVoid();
|
||||||
|
builder_.SetInsertPoint(prevBB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_statement(const shared_ptr<AstPL0> ast) {
|
||||||
|
if (!ast->nodes.empty()) {
|
||||||
|
compile_switch(ast->nodes[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_assignment(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto name = ast->nodes[0]->token;
|
||||||
|
|
||||||
|
auto fn = builder_.GetInsertBlock()->getParent();
|
||||||
|
auto tbl = fn->getValueSymbolTable();
|
||||||
|
auto var = tbl->lookup(name);
|
||||||
|
if (!var) {
|
||||||
|
var = module_->getGlobalVariable(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto val = compile_expression(ast->nodes[1]);
|
||||||
|
builder_.CreateStore(val, var);
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_call(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto fn = module_->getFunction(ast->nodes[0]->token);
|
||||||
|
builder_.CreateCall(fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_statements(const shared_ptr<AstPL0> ast) {
|
||||||
|
for (auto node : ast->nodes) {
|
||||||
|
compile_statement(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_if(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto cond = compile_condition(ast->nodes[0]);
|
||||||
|
|
||||||
|
auto fn = builder_.GetInsertBlock()->getParent();
|
||||||
|
auto ifThen = BasicBlock::Create(context_, "if.then", fn);
|
||||||
|
auto ifEnd = BasicBlock::Create(context_, "if.end");
|
||||||
|
|
||||||
|
builder_.CreateCondBr(cond, ifThen, ifEnd);
|
||||||
|
|
||||||
|
builder_.SetInsertPoint(ifThen);
|
||||||
|
compile_statement(ast->nodes[1]);
|
||||||
|
builder_.CreateBr(ifEnd);
|
||||||
|
|
||||||
|
fn->getBasicBlockList().push_back(ifEnd);
|
||||||
|
builder_.SetInsertPoint(ifEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_while(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto whileCond = BasicBlock::Create(context_, "while.cond");
|
||||||
|
builder_.CreateBr(whileCond);
|
||||||
|
|
||||||
|
auto fn = builder_.GetInsertBlock()->getParent();
|
||||||
|
fn->getBasicBlockList().push_back(whileCond);
|
||||||
|
builder_.SetInsertPoint(whileCond);
|
||||||
|
|
||||||
|
auto cond = compile_condition(ast->nodes[0]);
|
||||||
|
|
||||||
|
auto whileBody = BasicBlock::Create(context_, "while.body", fn);
|
||||||
|
auto whileEnd = BasicBlock::Create(context_, "while.end");
|
||||||
|
builder_.CreateCondBr(cond, whileBody, whileEnd);
|
||||||
|
|
||||||
|
builder_.SetInsertPoint(whileBody);
|
||||||
|
compile_statement(ast->nodes[1]);
|
||||||
|
|
||||||
|
builder_.CreateBr(whileCond);
|
||||||
|
|
||||||
|
fn->getBasicBlockList().push_back(whileEnd);
|
||||||
|
builder_.SetInsertPoint(whileEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_condition(const shared_ptr<AstPL0> ast) {
|
||||||
|
return compile_switch_value(ast->nodes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_odd(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto val = compile_expression(ast->nodes[0]);
|
||||||
|
return builder_.CreateICmpNE(val, builder_.getInt32(0), "icmpne");
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_compare(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto lhs = compile_expression(ast->nodes[0]);
|
||||||
|
auto rhs = compile_expression(ast->nodes[2]);
|
||||||
|
|
||||||
|
const auto& ope = ast->nodes[1]->token;
|
||||||
|
switch (ope[0]) {
|
||||||
|
case '=':
|
||||||
|
return builder_.CreateICmpEQ(lhs, rhs, "icmpeq");
|
||||||
|
case '#':
|
||||||
|
return builder_.CreateICmpNE(lhs, rhs, "icmpne");
|
||||||
|
case '<':
|
||||||
|
if (ope.size() == 1) {
|
||||||
|
return builder_.CreateICmpSLT(lhs, rhs, "icmpslt");
|
||||||
|
}
|
||||||
|
// '<='
|
||||||
|
return builder_.CreateICmpSLE(lhs, rhs, "icmpsle");
|
||||||
|
case '>':
|
||||||
|
if (ope.size() == 1) {
|
||||||
|
return builder_.CreateICmpSGT(lhs, rhs, "icmpsgt");
|
||||||
|
}
|
||||||
|
// '>='
|
||||||
|
return builder_.CreateICmpSGE(lhs, rhs, "icmpsge");
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void compile_out(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto val = compile_expression(ast->nodes[0]);
|
||||||
|
auto outF = module_->getFunction("out");
|
||||||
|
builder_.CreateCall(outF, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_expression(const shared_ptr<AstPL0> ast) {
|
||||||
|
const auto& nodes = ast->nodes;
|
||||||
|
|
||||||
|
auto sign = nodes[0]->token;
|
||||||
|
auto negative = !(sign.empty() || sign == "+");
|
||||||
|
|
||||||
|
auto val = compile_term(nodes[1]);
|
||||||
|
if (negative) {
|
||||||
|
val = builder_.CreateNeg(val, "negative");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i = 2u; i < nodes.size(); i += 2) {
|
||||||
|
auto ope = nodes[i + 0]->token[0];
|
||||||
|
auto rval = compile_term(nodes[i + 1]);
|
||||||
|
switch (ope) {
|
||||||
|
case '+':
|
||||||
|
val = builder_.CreateAdd(val, rval, "add");
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
val = builder_.CreateSub(val, rval, "sub");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_term(const shared_ptr<AstPL0> ast) {
|
||||||
|
const auto& nodes = ast->nodes;
|
||||||
|
auto val = compile_factor(nodes[0]);
|
||||||
|
for (auto i = 1u; i < nodes.size(); i += 2) {
|
||||||
|
auto ope = nodes[i + 0]->token[0];
|
||||||
|
auto rval = compile_switch_value(nodes[i + 1]);
|
||||||
|
switch (ope) {
|
||||||
|
case '*':
|
||||||
|
val = builder_.CreateMul(val, rval, "mul");
|
||||||
|
break;
|
||||||
|
case '/': {
|
||||||
|
// TODO: Zero devide error?
|
||||||
|
// auto ret = builder_.CreateICmpEQ(rval, builder_.getInt32(0),
|
||||||
|
// "icmpeq");
|
||||||
|
// if (!ret) {
|
||||||
|
// throw_runtime_error(ast, "divide by 0 error");
|
||||||
|
// }
|
||||||
|
val = builder_.CreateSDiv(val, rval, "div");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_factor(const shared_ptr<AstPL0> ast) {
|
||||||
|
return compile_switch_value(ast->nodes[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_ident(const shared_ptr<AstPL0> ast) {
|
||||||
|
auto name = ast->token;
|
||||||
|
|
||||||
|
auto fn = builder_.GetInsertBlock()->getParent();
|
||||||
|
auto tbl = fn->getValueSymbolTable();
|
||||||
|
auto var = tbl->lookup(name);
|
||||||
|
if (!var) {
|
||||||
|
var = module_->getGlobalVariable(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder_.CreateLoad(var);
|
||||||
|
}
|
||||||
|
|
||||||
|
Value* compile_number(const shared_ptr<AstPL0> ast) {
|
||||||
|
return ConstantInt::getIntegerValue(builder_.getInt32Ty(),
|
||||||
|
APInt(32, ast->token, 10));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main
|
* Main
|
||||||
*/
|
*/
|
||||||
@ -521,12 +878,31 @@ int main(int argc, const char** argv) {
|
|||||||
// Parse the source and make an AST
|
// Parse the source and make an AST
|
||||||
shared_ptr<AstPL0> ast;
|
shared_ptr<AstPL0> ast;
|
||||||
if (parser.parse_n(source.data(), source.size(), ast, path)) {
|
if (parser.parse_n(source.data(), source.size(), ast, path)) {
|
||||||
if (argc > 2 && string("--ast") == argv[2]) {
|
bool opt_llvm = false;
|
||||||
|
bool opt_ast = false;
|
||||||
|
{
|
||||||
|
auto argi = 2;
|
||||||
|
while (argi < argc) {
|
||||||
|
if (string("--ast") == argv[argi]) {
|
||||||
|
opt_ast = true;
|
||||||
|
} else if (string("--llvm") == argv[argi]) {
|
||||||
|
opt_llvm = true;
|
||||||
|
}
|
||||||
|
argi++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_ast) {
|
||||||
cout << ast_to_s(ast);
|
cout << ast_to_s(ast);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SymbolTable::build_on_ast(ast);
|
SymbolTable::build_on_ast(ast);
|
||||||
Interpreter::exec(ast);
|
if (opt_llvm) {
|
||||||
|
LLVM::exec(ast);
|
||||||
|
} else {
|
||||||
|
Interpreter::exec(ast);
|
||||||
|
}
|
||||||
} catch (const runtime_error& e) {
|
} catch (const runtime_error& e) {
|
||||||
cerr << e.what() << endl;
|
cerr << e.what() << endl;
|
||||||
}
|
}
|
||||||
@ -535,5 +911,3 @@ int main(int argc, const char** argv) {
|
|||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: et ts=2 sw=2 cin cino={1s ff=unix
|
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 14
|
|
||||||
VisualStudioVersion = 14.0.23107.0
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pl0", "pl0.vcxproj", "{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{F85B641A-7538-4809-8175-C528FF632CF6}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{F85B641A-7538-4809-8175-C528FF632CF6}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{F85B641A-7538-4809-8175-C528FF632CF6}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{F85B641A-7538-4809-8175-C528FF632CF6}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{1D09607B-E1C0-4D62-8AB4-9E2D2C2DC6E4}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{1D09607B-E1C0-4D62-8AB4-9E2D2C2DC6E4}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{1D09607B-E1C0-4D62-8AB4-9E2D2C2DC6E4}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{1D09607B-E1C0-4D62-8AB4-9E2D2C2DC6E4}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{E6146F73-3B4C-4D4C-BC55-148930954434}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{E6146F73-3B4C-4D4C-BC55-148930954434}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{E6146F73-3B4C-4D4C-BC55-148930954434}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E6146F73-3B4C-4D4C-BC55-148930954434}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,92 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\peglib.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="pl0.cc" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{6C5633BD-3CAE-498E-B0C6-ED90A1A99C47}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>sample</RootNamespace>
|
|
||||||
<ProjectName>pl0</ProjectName>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<AdditionalDependencies>Ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@ -20,7 +20,7 @@ END;
|
|||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
i := 0;
|
i := 0;
|
||||||
WHILE i < 30 DO BEGIN
|
WHILE i < 25 DO BEGIN
|
||||||
x := i;
|
x := i;
|
||||||
CALL fib;
|
CALL fib;
|
||||||
write i;
|
write i;
|
||||||
|
@ -3,7 +3,7 @@ VAR x, squ;
|
|||||||
|
|
||||||
PROCEDURE square;
|
PROCEDURE square;
|
||||||
BEGIN
|
BEGIN
|
||||||
squ:= x * x
|
squ := x * x
|
||||||
END;
|
END;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
|
Loading…
Reference in New Issue
Block a user