Compare commits

...

1 Commits

@ -0,0 +1,80 @@
// 编译期常量求值与常量初始化展开。
#pragma once
#include <cstdint>
#include <string>
#include <unordered_map>
#include <vector>
#include "SysYParser.h"
#include "sem/SymbolTable.h"
struct ConstValue {
SymbolDataType type = SymbolDataType::Unknown;
int64_t int_value = 0;
double float_value = 0.0;
bool bool_value = false;
static ConstValue FromInt(int64_t value);
static ConstValue FromFloat(double value);
static ConstValue FromBool(bool value);
bool IsScalar() const;
bool IsNumeric() const;
int64_t AsInt() const;
double AsFloat() const;
bool AsBool() const;
};
struct ConstArrayValue {
SymbolDataType elem_type = SymbolDataType::Unknown;
std::vector<int64_t> dims;
std::vector<ConstValue> elements;
};
class ConstEvalContext {
public:
ConstEvalContext();
void EnterScope();
void ExitScope();
bool DefineScalar(const std::string& name, ConstValue value);
bool DefineArray(const std::string& name, ConstArrayValue value);
const ConstValue* LookupScalar(const std::string& name) const;
const ConstArrayValue* LookupArray(const std::string& name) const;
private:
struct Binding {
bool is_array = false;
ConstValue scalar;
ConstArrayValue array;
};
using Scope = std::unordered_map<std::string, Binding>;
const Binding* LookupBinding(const std::string& name) const;
std::vector<Scope> scopes_;
};
class ConstEvaluator {
public:
ConstEvaluator(const SymbolTable& table, const ConstEvalContext& ctx);
ConstValue EvaluateConstExp(SysYParser::ConstExpContext& ctx) const;
ConstValue EvaluateExp(SysYParser::ExpContext& ctx) const;
// 数组维度必须是正整数。
int64_t EvaluateArrayDim(SysYParser::ConstExpContext& ctx) const;
// 展平 const 初始化列表,结果按行优先顺序存放。
std::vector<ConstValue> EvaluateConstInitList(
SysYParser::ConstInitValContext& init, SymbolDataType elem_type,
const std::vector<int64_t>& dims) const;
private:
const SymbolTable& table_;
const ConstEvalContext& ctx_;
};

@ -1,30 +1,48 @@
// 基于语法树的语义检查与名称绑定。
#pragma once
#include <list>
#include <unordered_map>
#include "SysYParser.h"
#include "sem/SymbolTable.h"
class SemanticContext {
public:
void BindVarUse(SysYParser::VarContext* use,
SysYParser::VarDefContext* decl) {
var_uses_[use] = decl;
SymbolEntry* RegisterSymbol(SymbolEntry symbol) {
symbols_.push_back(std::move(symbol));
return &symbols_.back();
}
SysYParser::VarDefContext* ResolveVarUse(
const SysYParser::VarContext* use) const {
auto it = var_uses_.find(use);
return it == var_uses_.end() ? nullptr : it->second;
void BindLValUse(SysYParser::LValContext* use, const SymbolEntry* symbol) {
lval_uses_[use] = symbol;
}
const SymbolEntry* ResolveLValUse(const SysYParser::LValContext* use) const {
auto it = lval_uses_.find(use);
return it == lval_uses_.end() ? nullptr : it->second;
}
void BindCallUse(SysYParser::UnaryExpContext* call,
const SymbolEntry* symbol) {
call_uses_[call] = symbol;
}
const SymbolEntry* ResolveCallUse(
const SysYParser::UnaryExpContext* call) const {
auto it = call_uses_.find(call);
return it == call_uses_.end() ? nullptr : it->second;
}
const std::list<SymbolEntry>& GetSymbols() const { return symbols_; }
private:
std::unordered_map<const SysYParser::VarContext*,
SysYParser::VarDefContext*>
var_uses_;
std::list<SymbolEntry> symbols_;
std::unordered_map<const SysYParser::LValContext*, const SymbolEntry*>
lval_uses_;
std::unordered_map<const SysYParser::UnaryExpContext*, const SymbolEntry*>
call_uses_;
};
// 目前仅检查:
// - 变量先声明后使用
// - 局部变量不允许重复定义
// 基于 SysY.g4 规则进行语义分析,构建 IR 导向的符号绑定结果。
SemanticContext RunSema(SysYParser::CompUnitContext& comp_unit);

@ -1,17 +1,76 @@
// 极简符号表:记录局部变量定义点
// IR 导向符号表:符号条目可直接挂接 IR 实体
#pragma once
#include <cstdint>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "SysYParser.h"
namespace antlr4 {
class ParserRuleContext;
} // namespace antlr4
namespace ir {
class Type;
class Value;
class Function;
} // namespace ir
enum class SymbolKind {
Variable,
Constant,
Function,
Parameter,
};
enum class SymbolDataType {
Unknown,
Void,
Int,
Float,
Bool,
};
struct SymbolEntry {
std::string name;
SymbolKind kind = SymbolKind::Variable;
SymbolDataType data_type = SymbolDataType::Unknown;
std::shared_ptr<ir::Type> type;
ir::Value* ir_value = nullptr;
ir::Function* ir_function = nullptr;
bool is_const = false;
bool is_global = false;
bool has_initializer = false;
bool is_array = false;
std::vector<int64_t> array_dims;
bool has_constexpr_value = false;
int64_t const_int_value = 0;
double const_float_value = 0.0;
std::vector<int64_t> const_int_init;
std::vector<double> const_float_init;
std::vector<SymbolDataType> param_types;
std::vector<bool> param_is_array;
const antlr4::ParserRuleContext* decl_ctx = nullptr;
};
class SymbolTable {
public:
void Add(const std::string& name, SysYParser::VarDefContext* decl);
SymbolTable();
void EnterScope();
void ExitScope();
bool Insert(const SymbolEntry* symbol);
bool Contains(const std::string& name) const;
SysYParser::VarDefContext* Lookup(const std::string& name) const;
bool ContainsCurrentScope(const std::string& name) const;
const SymbolEntry* Lookup(const std::string& name) const;
const SymbolEntry* LookupCurrentScope(const std::string& name) const;
private:
std::unordered_map<std::string, SysYParser::VarDefContext*> table_;
using Scope = std::unordered_map<std::string, const SymbolEntry*>;
std::vector<Scope> scopes_;
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,650 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- constDecl
| |-- CONST: const
| |-- bType
| | `-- INT: int
| |-- constDef
| | |-- Ident: a
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- RBRACK: ]
| | |-- ASSIGN: =
| | `-- constInitVal
| | |-- LBRACE: {
| | |-- constInitVal
| | | |-- LBRACE: {
| | | |-- constInitVal
| | | | `-- constExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | |-- COMMA: ,
| | | |-- constInitVal
| | | | `-- constExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 2
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- constInitVal
| | | |-- LBRACE: {
| | | |-- constInitVal
| | | | `-- constExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 3
| | | |-- COMMA: ,
| | | |-- constInitVal
| | | | `-- constExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 4
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- constInitVal
| | | |-- LBRACE: {
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- constInitVal
| | | `-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 7
| | `-- RBRACE: }
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- constDecl
| |-- CONST: const
| |-- bType
| | `-- INT: int
| |-- constDef
| | |-- Ident: N
| | |-- ASSIGN: =
| | `-- constInitVal
| | `-- constExp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 3
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: b
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- RBRACK: ]
| | |-- ASSIGN: =
| | `-- initVal
| | |-- LBRACE: {
| | `-- RBRACE: }
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: c
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- RBRACK: ]
| | |-- ASSIGN: =
| | `-- initVal
| | |-- LBRACE: {
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 3
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 5
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 6
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 7
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 8
| | `-- RBRACE: }
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: d
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: N
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- RBRACK: ]
| | |-- ASSIGN: =
| | `-- initVal
| | |-- LBRACE: {
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- COMMA: ,
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 3
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 5
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | |-- Ident: a
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 3
| | | |-- RBRACK: ]
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 0
| | | `-- RBRACK: ]
| | |-- COMMA: ,
| | |-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 8
| | `-- RBRACE: }
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: e
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | |-- RBRACK: ]
| | |-- ASSIGN: =
| | `-- initVal
| | |-- LBRACE: {
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | |-- Ident: d
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 2
| | | | |-- RBRACK: ]
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 1
| | | | `-- RBRACK: ]
| | | |-- COMMA: ,
| | | |-- initVal
| | | | |-- LBRACE: {
| | | | |-- initVal
| | | | | `-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | |-- Ident: c
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 2
| | | | | |-- RBRACK: ]
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 1
| | | | | `-- RBRACK: ]
| | | | `-- RBRACE: }
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 3
| | | |-- COMMA: ,
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 4
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 5
| | | |-- COMMA: ,
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 6
| | | `-- RBRACE: }
| | |-- COMMA: ,
| | |-- initVal
| | | |-- LBRACE: {
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 7
| | | |-- COMMA: ,
| | | |-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 8
| | | `-- RBRACE: }
| | `-- RBRACE: }
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | |-- addExp
| | | |-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | |-- Ident: e
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 3
| | | | | |-- RBRACK: ]
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 1
| | | | | |-- RBRACK: ]
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 0
| | | | | `-- RBRACK: ]
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | |-- Ident: e
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 0
| | | | |-- RBRACK: ]
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 0
| | | | |-- RBRACK: ]
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 0
| | | | `-- RBRACK: ]
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | |-- Ident: e
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 0
| | | |-- RBRACK: ]
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | |-- RBRACK: ]
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 0
| | | `-- RBRACK: ]
| | |-- ADD: +
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | |-- Ident: d
| | |-- LBRACK: [
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 3
| | |-- RBRACK: ]
| | |-- LBRACK: [
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 0
| | `-- RBRACK: ]
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,115 +1 @@
compUnit
|-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: a
| `-- SEMI: ;
|-- funcDef
| |-- funcType
| | `-- INT: int
| |-- Ident: func
| |-- LPAREN: (
| |-- funcFParams
| | `-- funcFParam
| | |-- bType
| | | `-- INT: int
| | `-- Ident: p
| |-- RPAREN: )
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: p
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: p
| | | |-- SUB: -
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- RETURN: return
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: p
| | `-- SEMI: ;
| `-- RBRACE: }
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: b
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: a
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 10
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: b
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: func
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: a
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: b
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,68 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: a
| |-- COMMA: ,
| |-- varDef
| | `-- Ident: b
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: a
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 10
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: b
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- unaryOp
| | | `-- SUB: -
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 1
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | |-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: a
| | |-- ADD: +
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: b
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,66 +1 @@
compUnit
|-- decl
| `-- constDecl
| |-- CONST: const
| |-- bType
| | `-- INT: int
| |-- constDef
| | |-- Ident: a
| | |-- ASSIGN: =
| | `-- constInitVal
| | `-- constExp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 10
| `-- SEMI: ;
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: b
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: b
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 2
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | |-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: b
| | |-- SUB: -
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: a
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,698 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: putch
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 97
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: putch
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 10
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: a
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 1
| |-- COMMA: ,
| |-- varDef
| | |-- Ident: putch
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: a
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: a
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 2
| | `-- SEMI: ;
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- INT: int
| | |-- varDef
| | | |-- Ident: b
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: a
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 3
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: b
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: b
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: putch
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: putch
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: a
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: b
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: b
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 5
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- decl
| | | `-- varDecl
| | | |-- bType
| | | | `-- INT: int
| | | |-- varDef
| | | | |-- Ident: main
| | | | |-- ASSIGN: =
| | | | `-- initVal
| | | | `-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 6
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: a
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: a
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: main
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: putch
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | |-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: putch
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: a
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: main
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | `-- block
| | | |-- LBRACE: {
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: b
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: b
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: a
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- decl
| | | | `-- varDecl
| | | | |-- bType
| | | | | `-- INT: int
| | | | |-- varDef
| | | | | |-- Ident: a
| | | | | |-- ASSIGN: =
| | | | | `-- initVal
| | | | | `-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: main
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 7
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: a
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: a
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 8
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: putch
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | |-- addExp
| | | | | | | |-- addExp
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: putch
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: a
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: b
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: main
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | `-- block
| | | | |-- LBRACE: {
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: b
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: b
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: a
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- decl
| | | | | `-- varDecl
| | | | | |-- bType
| | | | | | `-- INT: int
| | | | | |-- varDef
| | | | | | |-- Ident: b
| | | | | | |-- ASSIGN: =
| | | | | | `-- initVal
| | | | | | `-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: main
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 9
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: a
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: a
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 10
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- decl
| | | | | `-- constDecl
| | | | | |-- CONST: const
| | | | | |-- bType
| | | | | | `-- INT: int
| | | | | |-- constDef
| | | | | | |-- Ident: a
| | | | | | |-- ASSIGN: =
| | | | | | `-- constInitVal
| | | | | | `-- constExp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 11
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: b
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: b
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 12
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: putch
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | |-- addExp
| | | | | | | | |-- addExp
| | | | | | | | | `-- mulExp
| | | | | | | | | `-- unaryExp
| | | | | | | | | `-- primaryExp
| | | | | | | | | `-- lVal
| | | | | | | | | `-- Ident: putch
| | | | | | | | |-- ADD: +
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: a
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: b
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: main
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | `-- block
| | | | | |-- LBRACE: {
| | | | | |-- blockItem
| | | | | | `-- stmt
| | | | | | |-- lVal
| | | | | | | `-- Ident: main
| | | | | | |-- ASSIGN: =
| | | | | | |-- exp
| | | | | | | `-- addExp
| | | | | | | |-- addExp
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: main
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: b
| | | | | | `-- SEMI: ;
| | | | | |-- blockItem
| | | | | | `-- decl
| | | | | | `-- varDecl
| | | | | | |-- bType
| | | | | | | `-- INT: int
| | | | | | |-- varDef
| | | | | | | |-- Ident: main
| | | | | | | |-- ASSIGN: =
| | | | | | | `-- initVal
| | | | | | | `-- exp
| | | | | | | `-- addExp
| | | | | | | |-- addExp
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: b
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- number
| | | | | | | `-- IntConst: 13
| | | | | | `-- SEMI: ;
| | | | | |-- blockItem
| | | | | | `-- stmt
| | | | | | |-- lVal
| | | | | | | `-- Ident: main
| | | | | | |-- ASSIGN: =
| | | | | | |-- exp
| | | | | | | `-- addExp
| | | | | | | |-- addExp
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: main
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: a
| | | | | | `-- SEMI: ;
| | | | | |-- blockItem
| | | | | | `-- stmt
| | | | | | |-- lVal
| | | | | | | `-- Ident: putch
| | | | | | |-- ASSIGN: =
| | | | | | |-- exp
| | | | | | | `-- addExp
| | | | | | | |-- addExp
| | | | | | | | |-- addExp
| | | | | | | | | |-- addExp
| | | | | | | | | | `-- mulExp
| | | | | | | | | | `-- unaryExp
| | | | | | | | | | `-- primaryExp
| | | | | | | | | | `-- lVal
| | | | | | | | | | `-- Ident: putch
| | | | | | | | | |-- ADD: +
| | | | | | | | | `-- mulExp
| | | | | | | | | `-- unaryExp
| | | | | | | | | `-- primaryExp
| | | | | | | | | `-- lVal
| | | | | | | | | `-- Ident: a
| | | | | | | | |-- ADD: +
| | | | | | | | `-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: b
| | | | | | | |-- ADD: +
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: main
| | | | | | `-- SEMI: ;
| | | | | `-- RBRACE: }
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: putch
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: putch
| | | | | | |-- SUB: -
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: main
| | | | | `-- SEMI: ;
| | | | `-- RBRACE: }
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: putch
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: putch
| | | | | |-- SUB: -
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | `-- SEMI: ;
| | | `-- RBRACE: }
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: putch
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: putch
| | | | |-- SUB: -
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: a
| | | `-- SEMI: ;
| | `-- RBRACE: }
| `-- RBRACE: }
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | `-- mulExp
| | |-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: putch
| | |-- MOD: %
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 77
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,164 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: i
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: i
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: sum
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: sum
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- WHILE: while
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 100
| |-- RPAREN: )
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- IF: if
| | |-- LPAREN: (
| | |-- cond
| | | `-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | |-- eqExp
| | | | `-- relExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- EQ: ==
| | | `-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 50
| | |-- RPAREN: )
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- BREAK: break
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: sum
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: sum
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: i
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: sum
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,124 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | `-- Ident: a
| |-- COMMA: ,
| |-- varDef
| | `-- Ident: b
| |-- COMMA: ,
| |-- varDef
| | `-- Ident: c
| |-- COMMA: ,
| |-- varDef
| | `-- Ident: d
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: a
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 10
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: b
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 4
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: c
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 2
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: d
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 2
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | `-- mulExp
| | |-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | |-- LPAREN: (
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: c
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: a
| | | `-- RPAREN: )
| | |-- MUL: *
| | `-- unaryExp
| | `-- primaryExp
| | |-- LPAREN: (
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: b
| | | |-- SUB: -
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: d
| | `-- RPAREN: )
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,778 +1 @@
compUnit
|-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: COUNT
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 500000
| `-- SEMI: ;
|-- funcDef
| |-- funcType
| | `-- FLOAT: float
| |-- Ident: loop
| |-- LPAREN: (
| |-- funcFParams
| | |-- funcFParam
| | | |-- bType
| | | | `-- FLOAT: float
| | | |-- Ident: x
| | | |-- LBRACK: [
| | | `-- RBRACK: ]
| | |-- COMMA: ,
| | |-- funcFParam
| | | |-- bType
| | | | `-- FLOAT: float
| | | |-- Ident: y
| | | |-- LBRACK: [
| | | `-- RBRACK: ]
| | |-- COMMA: ,
| | `-- funcFParam
| | |-- bType
| | | `-- INT: int
| | `-- Ident: length
| |-- RPAREN: )
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- INT: int
| | |-- varDef
| | | |-- Ident: i
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 0
| | `-- SEMI: ;
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- FLOAT: float
| | |-- varDef
| | | |-- Ident: accumulator
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- FloatConst: 0.0
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- WHILE: while
| | |-- LPAREN: (
| | |-- cond
| | | `-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | `-- relExp
| | | |-- relExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- LT: <
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: length
| | |-- RPAREN: )
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: accumulator
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: accumulator
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | |-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | |-- Ident: x
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: i
| | | | | `-- RBRACK: ]
| | | | |-- MUL: *
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | |-- Ident: y
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: i
| | | | `-- RBRACK: ]
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: i
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: i
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- blockItem
| | `-- stmt
| | |-- RETURN: return
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: accumulator
| | `-- SEMI: ;
| `-- RBRACE: }
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: i
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| |-- COMMA: ,
| |-- varDef
| | |-- Ident: j
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: len
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: getint
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- FLOAT: float
| |-- varDef
| | |-- Ident: x
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4096
| | `-- RBRACK: ]
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- FLOAT: float
| |-- varDef
| | |-- Ident: y
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 4096
| | `-- RBRACK: ]
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- FLOAT: float
| |-- varDef
| | |-- Ident: total
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- FloatConst: 0.0
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- FLOAT: float
| |-- varDef
| | |-- Ident: a
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- FloatConst: 0.0
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- FLOAT: float
| |-- varDef
| | |-- Ident: b
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- FloatConst: 1.0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: starttime
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- WHILE: while
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: COUNT
| |-- RPAREN: )
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- IF: if
| | |-- LPAREN: (
| | |-- cond
| | | `-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | `-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | |-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- MOD: %
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 10
| | |-- RPAREN: )
| | |-- stmt
| | | `-- block
| | | |-- LBRACE: {
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: a
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- FloatConst: 0.0
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: b
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- FloatConst: 1.0
| | | | `-- SEMI: ;
| | | `-- RBRACE: }
| | |-- ELSE: else
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: a
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: a
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- FloatConst: 0.1
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: b
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- FloatConst: 0.2
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- blockItem
| | `-- stmt
| | |-- WHILE: while
| | |-- LPAREN: (
| | |-- cond
| | | `-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | `-- relExp
| | | |-- relExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: j
| | | |-- LT: <
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: len
| | |-- RPAREN: )
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | |-- Ident: x
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: j
| | | | `-- RBRACK: ]
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: a
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: j
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | |-- Ident: y
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: j
| | | | `-- RBRACK: ]
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: b
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: j
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: j
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: j
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: total
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: total
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | |-- Ident: loop
| | | |-- LPAREN: (
| | | |-- funcRParams
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: x
| | | | |-- COMMA: ,
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: y
| | | | |-- COMMA: ,
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: len
| | | `-- RPAREN: )
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: i
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: stoptime
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- IF: if
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | |-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | `-- relExp
| | | |-- relExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | |-- LPAREN: (
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: total
| | | | | |-- SUB: -
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- FloatConst: 11442437121638400.000000
| | | | `-- RPAREN: )
| | | |-- LE: <=
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- FloatConst: 0.000001
| | |-- OR: ||
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | |-- LPAREN: (
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: total
| | | | |-- SUB: -
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- FloatConst: 11442437121638400.000000
| | | `-- RPAREN: )
| | |-- GE: >=
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- unaryOp
| | | `-- SUB: -
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- FloatConst: 0.000001
| |-- RPAREN: )
| |-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | |-- Ident: putint
| | | | |-- LPAREN: (
| | | | |-- funcRParams
| | | | | `-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 0
| | | | `-- RPAREN: )
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- RETURN: return
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 0
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- ELSE: else
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | |-- Ident: putint
| | | |-- LPAREN: (
| | | |-- funcRParams
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | `-- RPAREN: )
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- RETURN: return
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,62 +1 @@
compUnit
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: a
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 1
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: b
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 2
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | |-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: a
| | |-- ADD: +
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: b
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

@ -1,889 +1 @@
compUnit
|-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: matrix
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 20000000
| | `-- RBRACK: ]
| `-- SEMI: ;
|-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: a
| | |-- LBRACK: [
| | |-- constExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 100000
| | `-- RBRACK: ]
| `-- SEMI: ;
|-- funcDef
| |-- funcType
| | `-- INT: int
| |-- Ident: transpose
| |-- LPAREN: (
| |-- funcFParams
| | |-- funcFParam
| | | |-- bType
| | | | `-- INT: int
| | | `-- Ident: n
| | |-- COMMA: ,
| | |-- funcFParam
| | | |-- bType
| | | | `-- INT: int
| | | |-- Ident: matrix
| | | |-- LBRACK: [
| | | `-- RBRACK: ]
| | |-- COMMA: ,
| | `-- funcFParam
| | |-- bType
| | | `-- INT: int
| | `-- Ident: rowsize
| |-- RPAREN: )
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- INT: int
| | |-- varDef
| | | |-- Ident: colsize
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | |-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: n
| | | |-- DIV: /
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: rowsize
| | `-- SEMI: ;
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- INT: int
| | |-- varDef
| | | |-- Ident: i
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 0
| | `-- SEMI: ;
| |-- blockItem
| | `-- decl
| | `-- varDecl
| | |-- bType
| | | `-- INT: int
| | |-- varDef
| | | |-- Ident: j
| | | |-- ASSIGN: =
| | | `-- initVal
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 0
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- WHILE: while
| | |-- LPAREN: (
| | |-- cond
| | | `-- lOrExp
| | | `-- lAndExp
| | | `-- eqExp
| | | `-- relExp
| | | |-- relExp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- LT: <
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: colsize
| | |-- RPAREN: )
| | `-- stmt
| | `-- block
| | |-- LBRACE: {
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: j
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 0
| | | `-- SEMI: ;
| | |-- blockItem
| | | `-- stmt
| | | |-- WHILE: while
| | | |-- LPAREN: (
| | | |-- cond
| | | | `-- lOrExp
| | | | `-- lAndExp
| | | | `-- eqExp
| | | | `-- relExp
| | | | |-- relExp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: j
| | | | |-- LT: <
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: rowsize
| | | |-- RPAREN: )
| | | `-- stmt
| | | `-- block
| | | |-- LBRACE: {
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- IF: if
| | | | |-- LPAREN: (
| | | | |-- cond
| | | | | `-- lOrExp
| | | | | `-- lAndExp
| | | | | `-- eqExp
| | | | | `-- relExp
| | | | | |-- relExp
| | | | | | `-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: i
| | | | | |-- LT: <
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: j
| | | | |-- RPAREN: )
| | | | `-- stmt
| | | | `-- block
| | | | |-- LBRACE: {
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- lVal
| | | | | | `-- Ident: j
| | | | | |-- ASSIGN: =
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: j
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- number
| | | | | | `-- IntConst: 1
| | | | | `-- SEMI: ;
| | | | |-- blockItem
| | | | | `-- stmt
| | | | | |-- CONTINUE: continue
| | | | | `-- SEMI: ;
| | | | `-- RBRACE: }
| | | |-- blockItem
| | | | `-- decl
| | | | `-- varDecl
| | | | |-- bType
| | | | | `-- INT: int
| | | | |-- varDef
| | | | | |-- Ident: curr
| | | | | |-- ASSIGN: =
| | | | | `-- initVal
| | | | | `-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | |-- Ident: matrix
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | |-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: i
| | | | | | | |-- MUL: *
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: rowsize
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: j
| | | | | `-- RBRACK: ]
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | |-- Ident: matrix
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | |-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: j
| | | | | | | |-- MUL: *
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: colsize
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: i
| | | | | `-- RBRACK: ]
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | |-- Ident: matrix
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | |-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: i
| | | | | | | |-- MUL: *
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: rowsize
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: j
| | | | | `-- RBRACK: ]
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | |-- Ident: matrix
| | | | | |-- LBRACK: [
| | | | | |-- exp
| | | | | | `-- addExp
| | | | | | |-- addExp
| | | | | | | `-- mulExp
| | | | | | | |-- mulExp
| | | | | | | | `-- unaryExp
| | | | | | | | `-- primaryExp
| | | | | | | | `-- lVal
| | | | | | | | `-- Ident: i
| | | | | | | |-- MUL: *
| | | | | | | `-- unaryExp
| | | | | | | `-- primaryExp
| | | | | | | `-- lVal
| | | | | | | `-- Ident: rowsize
| | | | | | |-- ADD: +
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: j
| | | | | `-- RBRACK: ]
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: curr
| | | | `-- SEMI: ;
| | | |-- blockItem
| | | | `-- stmt
| | | | |-- lVal
| | | | | `-- Ident: j
| | | | |-- ASSIGN: =
| | | | |-- exp
| | | | | `-- addExp
| | | | | |-- addExp
| | | | | | `-- mulExp
| | | | | | `-- unaryExp
| | | | | | `-- primaryExp
| | | | | | `-- lVal
| | | | | | `-- Ident: j
| | | | | |-- ADD: +
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- number
| | | | | `-- IntConst: 1
| | | | `-- SEMI: ;
| | | `-- RBRACE: }
| | |-- blockItem
| | | `-- stmt
| | | |-- lVal
| | | | `-- Ident: i
| | | |-- ASSIGN: =
| | | |-- exp
| | | | `-- addExp
| | | | |-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: i
| | | | |-- ADD: +
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- number
| | | | `-- IntConst: 1
| | | `-- SEMI: ;
| | `-- RBRACE: }
| |-- blockItem
| | `-- stmt
| | |-- RETURN: return
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | |-- unaryOp
| | | | `-- SUB: -
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
`-- funcDef
|-- funcType
| `-- INT: int
|-- Ident: main
|-- LPAREN: (
|-- RPAREN: )
`-- block
|-- LBRACE: {
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: n
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: getint
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: len
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: getarray
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: a
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: starttime
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: i
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- WHILE: while
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: n
| |-- RPAREN: )
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | |-- Ident: matrix
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | `-- RBRACK: ]
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: i
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: i
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- WHILE: while
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: len
| |-- RPAREN: )
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | |-- Ident: transpose
| | | |-- LPAREN: (
| | | |-- funcRParams
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: n
| | | | |-- COMMA: ,
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: matrix
| | | | |-- COMMA: ,
| | | | `-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | |-- Ident: a
| | | | |-- LBRACK: [
| | | | |-- exp
| | | | | `-- addExp
| | | | | `-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: i
| | | | `-- RBRACK: ]
| | | `-- RPAREN: )
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: i
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
|-- blockItem
| `-- decl
| `-- varDecl
| |-- bType
| | `-- INT: int
| |-- varDef
| | |-- Ident: ans
| | |-- ASSIGN: =
| | `-- initVal
| | `-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- lVal
| | `-- Ident: i
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- WHILE: while
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: i
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: len
| |-- RPAREN: )
| `-- stmt
| `-- block
| |-- LBRACE: {
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: ans
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: ans
| | | |-- ADD: +
| | | `-- mulExp
| | | |-- mulExp
| | | | |-- mulExp
| | | | | `-- unaryExp
| | | | | `-- primaryExp
| | | | | `-- lVal
| | | | | `-- Ident: i
| | | | |-- MUL: *
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- MUL: *
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | |-- Ident: matrix
| | | |-- LBRACK: [
| | | |-- exp
| | | | `-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | `-- RBRACK: ]
| | `-- SEMI: ;
| |-- blockItem
| | `-- stmt
| | |-- lVal
| | | `-- Ident: i
| | |-- ASSIGN: =
| | |-- exp
| | | `-- addExp
| | | |-- addExp
| | | | `-- mulExp
| | | | `-- unaryExp
| | | | `-- primaryExp
| | | | `-- lVal
| | | | `-- Ident: i
| | | |-- ADD: +
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 1
| | `-- SEMI: ;
| `-- RBRACE: }
|-- blockItem
| `-- stmt
| |-- IF: if
| |-- LPAREN: (
| |-- cond
| | `-- lOrExp
| | `-- lAndExp
| | `-- eqExp
| | `-- relExp
| | |-- relExp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: ans
| | |-- LT: <
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| |-- RPAREN: )
| `-- stmt
| |-- lVal
| | `-- Ident: ans
| |-- ASSIGN: =
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- unaryOp
| | | `-- SUB: -
| | `-- unaryExp
| | `-- primaryExp
| | `-- lVal
| | `-- Ident: ans
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: stoptime
| | |-- LPAREN: (
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: putint
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- lVal
| | | `-- Ident: ans
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | |-- Ident: putch
| | |-- LPAREN: (
| | |-- funcRParams
| | | `-- exp
| | | `-- addExp
| | | `-- mulExp
| | | `-- unaryExp
| | | `-- primaryExp
| | | `-- number
| | | `-- IntConst: 10
| | `-- RPAREN: )
| `-- SEMI: ;
|-- blockItem
| `-- stmt
| |-- RETURN: return
| |-- exp
| | `-- addExp
| | `-- mulExp
| | `-- unaryExp
| | `-- primaryExp
| | `-- number
| | `-- IntConst: 0
| `-- SEMI: ;
`-- RBRACE: }
./scripts/lab1_build_test.sh: line 111: /home/zhangwanzheng/nudt-compiler-cpp/build/bin/compiler: No such file or directory

File diff suppressed because it is too large Load Diff

@ -1,4 +1,752 @@
// 常量求值:
// - 处理数组维度、全局初始化、const 表达式等编译期可计算场景
// - 为语义分析与 IR 生成提供常量折叠/常量值信息
#include "sem/ConstEval.h"
#include <any>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <stdexcept>
#include <string>
#include <utility>
#include "SysYBaseVisitor.h"
#include "utils/Log.h"
namespace {
using DataType = SymbolDataType;
bool IsNumericType(DataType type) {
return type == DataType::Int || type == DataType::Float ||
type == DataType::Bool;
}
ConstValue MakeZeroValue(DataType type) {
switch (type) {
case DataType::Float:
return ConstValue::FromFloat(0.0);
case DataType::Int:
return ConstValue::FromInt(0);
case DataType::Bool:
return ConstValue::FromBool(false);
default:
return ConstValue{};
}
}
ConstValue CastToType(ConstValue value, DataType target_type) {
switch (target_type) {
case DataType::Int:
return ConstValue::FromInt(value.AsInt());
case DataType::Float:
return ConstValue::FromFloat(value.AsFloat());
case DataType::Bool:
return ConstValue::FromBool(value.AsBool());
default:
throw std::runtime_error(
FormatError("consteval", "不支持的常量目标类型转换"));
}
}
int64_t ParseIntLiteral(const std::string& text) {
char* end = nullptr;
const long long value = std::strtoll(text.c_str(), &end, 0);
if (end == text.c_str() || *end != '\0') {
throw std::runtime_error(
FormatError("consteval", "整数字面量解析失败: " + text));
}
return static_cast<int64_t>(value);
}
double ParseFloatLiteral(const std::string& text) {
char* end = nullptr;
const double value = std::strtod(text.c_str(), &end);
if (end == text.c_str() || *end != '\0') {
throw std::runtime_error(
FormatError("consteval", "浮点数字面量解析失败: " + text));
}
return value;
}
size_t Product(const std::vector<int64_t>& dims, size_t begin) {
size_t result = 1;
for (size_t i = begin; i < dims.size(); ++i) {
if (dims[i] <= 0) {
throw std::runtime_error(
FormatError("consteval", "数组维度必须为正整数"));
}
const size_t dim = static_cast<size_t>(dims[i]);
if (result > std::numeric_limits<size_t>::max() / dim) {
throw std::runtime_error(
FormatError("consteval", "数组维度乘积溢出"));
}
result *= dim;
}
return result;
}
class ConstEvalVisitor final : public SysYBaseVisitor {
public:
ConstEvalVisitor(const SymbolTable& table, const ConstEvalContext& values)
: table_(table), values_(values) {}
ConstValue EvaluateConstExp(SysYParser::ConstExpContext& ctx) {
return Evaluate(ctx.addExp());
}
ConstValue EvaluateExp(SysYParser::ExpContext& ctx) {
return Evaluate(ctx.addExp());
}
std::any visitExp(SysYParser::ExpContext* ctx) override {
if (!ctx || !ctx->addExp()) {
throw std::runtime_error(FormatError("consteval", "非法表达式"));
}
return Evaluate(ctx->addExp());
}
std::any visitConstExp(SysYParser::ConstExpContext* ctx) override {
if (!ctx || !ctx->addExp()) {
throw std::runtime_error(FormatError("consteval", "非法 constExp"));
}
return Evaluate(ctx->addExp());
}
std::any visitCond(SysYParser::CondContext* ctx) override {
if (!ctx || !ctx->lOrExp()) {
throw std::runtime_error(FormatError("consteval", "非法条件表达式"));
}
return Evaluate(ctx->lOrExp());
}
std::any visitLVal(SysYParser::LValContext* ctx) override {
if (!ctx || !ctx->Ident()) {
throw std::runtime_error(FormatError("consteval", "非法左值"));
}
const std::string name = ctx->Ident()->getText();
const SymbolEntry* symbol = table_.Lookup(name);
if (!symbol) {
throw std::runtime_error(FormatError("consteval", "未定义符号: " + name));
}
if (!symbol->is_const && symbol->kind != SymbolKind::Constant) {
throw std::runtime_error(
FormatError("consteval", "常量表达式中使用了非常量符号: " + name));
}
const size_t index_count = ctx->exp().size();
if (index_count == 0) {
if (const ConstValue* scalar = values_.LookupScalar(name)) {
return *scalar;
}
if (values_.LookupArray(name)) {
throw std::runtime_error(
FormatError("consteval", "数组名不能作为标量常量参与求值: " + name));
}
throw std::runtime_error(
FormatError("consteval", "常量符号缺少编译期值: " + name));
}
const ConstArrayValue* array = values_.LookupArray(name);
if (!array) {
throw std::runtime_error(
FormatError("consteval", "下标访问目标不是常量数组: " + name));
}
if (index_count != array->dims.size()) {
throw std::runtime_error(
FormatError("consteval", "常量数组索引维度不匹配: " + name));
}
size_t linear_index = 0;
for (size_t i = 0; i < index_count; ++i) {
const ConstValue index_value = Evaluate(ctx->exp(i));
const int64_t index = index_value.AsInt();
const int64_t dim = array->dims[i];
if (index < 0 || index >= dim) {
throw std::runtime_error(
FormatError("consteval", "常量数组访问越界: " + name));
}
linear_index = linear_index * static_cast<size_t>(dim) +
static_cast<size_t>(index);
}
if (linear_index >= array->elements.size()) {
throw std::runtime_error(
FormatError("consteval", "常量数组线性索引越界: " + name));
}
return array->elements[linear_index];
}
std::any visitPrimaryExp(SysYParser::PrimaryExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 primaryExp"));
}
if (ctx->exp()) {
return Evaluate(ctx->exp());
}
if (ctx->lVal()) {
return Evaluate(ctx->lVal());
}
if (ctx->number()) {
return Evaluate(ctx->number());
}
throw std::runtime_error(FormatError("consteval", "无法识别的 primaryExp"));
}
std::any visitNumber(SysYParser::NumberContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法数字节点"));
}
if (ctx->IntConst()) {
return ConstValue::FromInt(ParseIntLiteral(ctx->IntConst()->getText()));
}
if (ctx->FloatConst()) {
return ConstValue::FromFloat(
ParseFloatLiteral(ctx->FloatConst()->getText()));
}
throw std::runtime_error(FormatError("consteval", "未知数字字面量类型"));
}
std::any visitUnaryExp(SysYParser::UnaryExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 unaryExp"));
}
if (ctx->primaryExp()) {
return Evaluate(ctx->primaryExp());
}
if (ctx->Ident()) {
throw std::runtime_error(
FormatError("consteval", "常量表达式中不允许函数调用: " +
ctx->Ident()->getText()));
}
if (!ctx->unaryOp() || !ctx->unaryExp()) {
throw std::runtime_error(FormatError("consteval", "非法一元表达式结构"));
}
const ConstValue operand = Evaluate(ctx->unaryExp());
if (ctx->unaryOp()->ADD()) {
if (!operand.IsNumeric()) {
throw std::runtime_error(FormatError("consteval", "一元加仅支持数值类型"));
}
if (operand.type == DataType::Float) {
return ConstValue::FromFloat(+operand.AsFloat());
}
return ConstValue::FromInt(+operand.AsInt());
}
if (ctx->unaryOp()->SUB()) {
if (!operand.IsNumeric()) {
throw std::runtime_error(FormatError("consteval", "一元减仅支持数值类型"));
}
if (operand.type == DataType::Float) {
return ConstValue::FromFloat(-operand.AsFloat());
}
return ConstValue::FromInt(-operand.AsInt());
}
if (ctx->unaryOp()->NOT()) {
return ConstValue::FromBool(!operand.AsBool());
}
throw std::runtime_error(FormatError("consteval", "未知一元运算符"));
}
std::any visitMulExp(SysYParser::MulExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 mulExp"));
}
if (!ctx->mulExp()) {
return Evaluate(ctx->unaryExp());
}
const ConstValue lhs = Evaluate(ctx->mulExp());
const ConstValue rhs = Evaluate(ctx->unaryExp());
if (!lhs.IsNumeric() || !rhs.IsNumeric()) {
throw std::runtime_error(
FormatError("consteval", "乘除模运算只支持数值类型"));
}
const int op = ctx->op ? ctx->op->getType() : 0;
if (op == SysYParser::MUL) {
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
return ConstValue::FromFloat(lhs.AsFloat() * rhs.AsFloat());
}
return ConstValue::FromInt(lhs.AsInt() * rhs.AsInt());
}
if (op == SysYParser::DIV) {
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
const double divisor = rhs.AsFloat();
if (divisor == 0.0) {
throw std::runtime_error(FormatError("consteval", "浮点除零"));
}
return ConstValue::FromFloat(lhs.AsFloat() / divisor);
}
const int64_t divisor = rhs.AsInt();
if (divisor == 0) {
throw std::runtime_error(FormatError("consteval", "整数除零"));
}
return ConstValue::FromInt(lhs.AsInt() / divisor);
}
if (op == SysYParser::MOD) {
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
throw std::runtime_error(
FormatError("consteval", "取模运算不支持浮点类型"));
}
const int64_t divisor = rhs.AsInt();
if (divisor == 0) {
throw std::runtime_error(FormatError("consteval", "整数取模除零"));
}
return ConstValue::FromInt(lhs.AsInt() % divisor);
}
throw std::runtime_error(FormatError("consteval", "未知乘法类运算符"));
}
std::any visitAddExp(SysYParser::AddExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 addExp"));
}
if (!ctx->addExp()) {
return Evaluate(ctx->mulExp());
}
const ConstValue lhs = Evaluate(ctx->addExp());
const ConstValue rhs = Evaluate(ctx->mulExp());
if (!lhs.IsNumeric() || !rhs.IsNumeric()) {
throw std::runtime_error(FormatError("consteval", "加减运算只支持数值类型"));
}
const int op = ctx->op ? ctx->op->getType() : 0;
if (op == SysYParser::ADD) {
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
return ConstValue::FromFloat(lhs.AsFloat() + rhs.AsFloat());
}
return ConstValue::FromInt(lhs.AsInt() + rhs.AsInt());
}
if (op == SysYParser::SUB) {
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
return ConstValue::FromFloat(lhs.AsFloat() - rhs.AsFloat());
}
return ConstValue::FromInt(lhs.AsInt() - rhs.AsInt());
}
throw std::runtime_error(FormatError("consteval", "未知加法类运算符"));
}
std::any visitRelExp(SysYParser::RelExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 relExp"));
}
if (!ctx->relExp()) {
return Evaluate(ctx->addExp());
}
const ConstValue lhs = Evaluate(ctx->relExp());
const ConstValue rhs = Evaluate(ctx->addExp());
if (!lhs.IsNumeric() || !rhs.IsNumeric()) {
throw std::runtime_error(
FormatError("consteval", "关系比较仅支持数值类型"));
}
const int op = ctx->op ? ctx->op->getType() : 0;
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
const double left = lhs.AsFloat();
const double right = rhs.AsFloat();
if (op == SysYParser::LT) {
return ConstValue::FromBool(left < right);
}
if (op == SysYParser::GT) {
return ConstValue::FromBool(left > right);
}
if (op == SysYParser::LE) {
return ConstValue::FromBool(left <= right);
}
if (op == SysYParser::GE) {
return ConstValue::FromBool(left >= right);
}
} else {
const int64_t left = lhs.AsInt();
const int64_t right = rhs.AsInt();
if (op == SysYParser::LT) {
return ConstValue::FromBool(left < right);
}
if (op == SysYParser::GT) {
return ConstValue::FromBool(left > right);
}
if (op == SysYParser::LE) {
return ConstValue::FromBool(left <= right);
}
if (op == SysYParser::GE) {
return ConstValue::FromBool(left >= right);
}
}
throw std::runtime_error(FormatError("consteval", "未知关系比较运算符"));
}
std::any visitEqExp(SysYParser::EqExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 eqExp"));
}
if (!ctx->eqExp()) {
return Evaluate(ctx->relExp());
}
const ConstValue lhs = Evaluate(ctx->eqExp());
const ConstValue rhs = Evaluate(ctx->relExp());
const int op = ctx->op ? ctx->op->getType() : 0;
bool result = false;
if (lhs.type == DataType::Float || rhs.type == DataType::Float) {
const double left = lhs.AsFloat();
const double right = rhs.AsFloat();
if (op == SysYParser::EQ) {
result = (left == right);
} else if (op == SysYParser::NE) {
result = (left != right);
} else {
throw std::runtime_error(FormatError("consteval", "未知相等比较运算符"));
}
} else {
const int64_t left = lhs.AsInt();
const int64_t right = rhs.AsInt();
if (op == SysYParser::EQ) {
result = (left == right);
} else if (op == SysYParser::NE) {
result = (left != right);
} else {
throw std::runtime_error(FormatError("consteval", "未知相等比较运算符"));
}
}
return ConstValue::FromBool(result);
}
std::any visitLAndExp(SysYParser::LAndExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 lAndExp"));
}
if (!ctx->lAndExp()) {
return ConstValue::FromBool(Evaluate(ctx->eqExp()).AsBool());
}
const ConstValue lhs = Evaluate(ctx->lAndExp());
if (!lhs.AsBool()) {
return ConstValue::FromBool(false);
}
const ConstValue rhs = Evaluate(ctx->eqExp());
return ConstValue::FromBool(rhs.AsBool());
}
std::any visitLOrExp(SysYParser::LOrExpContext* ctx) override {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "非法 lOrExp"));
}
if (!ctx->lOrExp()) {
return ConstValue::FromBool(Evaluate(ctx->lAndExp()).AsBool());
}
const ConstValue lhs = Evaluate(ctx->lOrExp());
if (lhs.AsBool()) {
return ConstValue::FromBool(true);
}
const ConstValue rhs = Evaluate(ctx->lAndExp());
return ConstValue::FromBool(rhs.AsBool());
}
private:
ConstValue Evaluate(antlr4::ParserRuleContext* ctx) {
if (!ctx) {
throw std::runtime_error(FormatError("consteval", "空表达式节点"));
}
std::any result = ctx->accept(this);
try {
return std::any_cast<ConstValue>(result);
} catch (const std::bad_any_cast&) {
throw std::runtime_error(FormatError("consteval", "常量求值类型转换失败"));
}
}
const SymbolTable& table_;
const ConstEvalContext& values_;
};
ConstValue EvaluateScalarInit(SysYParser::ConstInitValContext& init,
DataType elem_type,
ConstEvalVisitor& evaluator) {
if (init.constExp()) {
return CastToType(evaluator.EvaluateConstExp(*init.constExp()), elem_type);
}
if (init.constInitVal().empty()) {
return MakeZeroValue(elem_type);
}
if (init.constInitVal().size() == 1) {
return EvaluateScalarInit(*init.constInitVal().front(), elem_type,
evaluator);
}
throw std::runtime_error(
FormatError("consteval", "标量初始化含有过多元素"));
}
void FillConstArrayObject(SysYParser::ConstInitValContext& init,
size_t depth, size_t base, size_t span,
const std::vector<int64_t>& dims, DataType elem_type,
std::vector<ConstValue>& out,
ConstEvalVisitor& evaluator) {
if (depth >= dims.size()) {
out[base] = EvaluateScalarInit(init, elem_type, evaluator);
return;
}
if (init.constExp()) {
out[base] = CastToType(evaluator.EvaluateConstExp(*init.constExp()),
elem_type);
return;
}
if (init.constInitVal().empty()) {
return;
}
const size_t end = base + span;
size_t cursor = base;
const size_t subspan = (depth + 1 < dims.size()) ? Product(dims, depth + 1)
: static_cast<size_t>(1);
for (auto* child : init.constInitVal()) {
if (!child) {
continue;
}
if (cursor >= end) {
throw std::runtime_error(
FormatError("consteval", "数组初始化元素过多"));
}
if (depth + 1 >= dims.size()) {
out[cursor] = EvaluateScalarInit(*child, elem_type, evaluator);
++cursor;
continue;
}
if (child->constExp()) {
out[cursor] = CastToType(evaluator.EvaluateConstExp(*child->constExp()),
elem_type);
++cursor;
continue;
}
const size_t rel = cursor - base;
if (subspan > 1 && rel % subspan != 0) {
cursor += (subspan - (rel % subspan));
}
if (cursor >= end) {
throw std::runtime_error(
FormatError("consteval", "数组初始化嵌套层级与维度不匹配"));
}
FillConstArrayObject(*child, depth + 1, cursor, subspan, dims, elem_type,
out, evaluator);
cursor += subspan;
}
}
} // namespace
ConstValue ConstValue::FromInt(int64_t value) {
ConstValue result;
result.type = SymbolDataType::Int;
result.int_value = value;
result.float_value = static_cast<double>(value);
result.bool_value = (value != 0);
return result;
}
ConstValue ConstValue::FromFloat(double value) {
ConstValue result;
result.type = SymbolDataType::Float;
result.int_value = static_cast<int64_t>(value);
result.float_value = value;
result.bool_value = (value != 0.0);
return result;
}
ConstValue ConstValue::FromBool(bool value) {
ConstValue result;
result.type = SymbolDataType::Bool;
result.int_value = value ? 1 : 0;
result.float_value = value ? 1.0 : 0.0;
result.bool_value = value;
return result;
}
bool ConstValue::IsScalar() const { return type != SymbolDataType::Unknown; }
bool ConstValue::IsNumeric() const {
return type == SymbolDataType::Int || type == SymbolDataType::Float ||
type == SymbolDataType::Bool;
}
int64_t ConstValue::AsInt() const {
if (type == SymbolDataType::Int) {
return int_value;
}
if (type == SymbolDataType::Float) {
return static_cast<int64_t>(float_value);
}
if (type == SymbolDataType::Bool) {
return bool_value ? 1 : 0;
}
throw std::runtime_error(FormatError("consteval", "当前值不能转为整数"));
}
double ConstValue::AsFloat() const {
if (type == SymbolDataType::Float) {
return float_value;
}
if (type == SymbolDataType::Int) {
return static_cast<double>(int_value);
}
if (type == SymbolDataType::Bool) {
return bool_value ? 1.0 : 0.0;
}
throw std::runtime_error(FormatError("consteval", "当前值不能转为浮点数"));
}
bool ConstValue::AsBool() const {
if (type == SymbolDataType::Bool) {
return bool_value;
}
if (type == SymbolDataType::Int) {
return int_value != 0;
}
if (type == SymbolDataType::Float) {
return float_value != 0.0;
}
throw std::runtime_error(FormatError("consteval", "当前值不能转为布尔值"));
}
ConstEvalContext::ConstEvalContext() { EnterScope(); }
void ConstEvalContext::EnterScope() { scopes_.emplace_back(); }
void ConstEvalContext::ExitScope() {
if (scopes_.size() <= 1) {
throw std::runtime_error("const eval scope underflow");
}
scopes_.pop_back();
}
bool ConstEvalContext::DefineScalar(const std::string& name, ConstValue value) {
if (scopes_.empty()) {
EnterScope();
}
auto& current = scopes_.back();
if (current.find(name) != current.end()) {
return false;
}
Binding binding;
binding.is_array = false;
binding.scalar = std::move(value);
current.emplace(name, std::move(binding));
return true;
}
bool ConstEvalContext::DefineArray(const std::string& name,
ConstArrayValue value) {
if (scopes_.empty()) {
EnterScope();
}
auto& current = scopes_.back();
if (current.find(name) != current.end()) {
return false;
}
Binding binding;
binding.is_array = true;
binding.array = std::move(value);
current.emplace(name, std::move(binding));
return true;
}
const ConstValue* ConstEvalContext::LookupScalar(const std::string& name) const {
const Binding* binding = LookupBinding(name);
if (!binding || binding->is_array) {
return nullptr;
}
return &binding->scalar;
}
const ConstArrayValue* ConstEvalContext::LookupArray(
const std::string& name) const {
const Binding* binding = LookupBinding(name);
if (!binding || !binding->is_array) {
return nullptr;
}
return &binding->array;
}
const ConstEvalContext::Binding* ConstEvalContext::LookupBinding(
const std::string& name) const {
for (auto it = scopes_.rbegin(); it != scopes_.rend(); ++it) {
auto found = it->find(name);
if (found != it->end()) {
return &found->second;
}
}
return nullptr;
}
ConstEvaluator::ConstEvaluator(const SymbolTable& table,
const ConstEvalContext& ctx)
: table_(table), ctx_(ctx) {}
ConstValue ConstEvaluator::EvaluateConstExp(
SysYParser::ConstExpContext& ctx) const {
ConstEvalVisitor visitor(table_, ctx_);
return visitor.EvaluateConstExp(ctx);
}
ConstValue ConstEvaluator::EvaluateExp(SysYParser::ExpContext& ctx) const {
ConstEvalVisitor visitor(table_, ctx_);
return visitor.EvaluateExp(ctx);
}
int64_t ConstEvaluator::EvaluateArrayDim(
SysYParser::ConstExpContext& ctx) const {
const ConstValue value = EvaluateConstExp(ctx);
if (!IsNumericType(value.type)) {
throw std::runtime_error(
FormatError("consteval", "数组维度必须是数值类型"));
}
if (value.type == DataType::Float) {
const double as_float = value.AsFloat();
if (std::trunc(as_float) != as_float) {
throw std::runtime_error(
FormatError("consteval", "数组维度必须是整数"));
}
}
const int64_t dim = value.AsInt();
if (dim <= 0) {
throw std::runtime_error(
FormatError("consteval", "数组维度必须是正整数"));
}
return dim;
}
std::vector<ConstValue> ConstEvaluator::EvaluateConstInitList(
SysYParser::ConstInitValContext& init, SymbolDataType elem_type,
const std::vector<int64_t>& dims) const {
if (elem_type != DataType::Int && elem_type != DataType::Float &&
elem_type != DataType::Bool) {
throw std::runtime_error(
FormatError("consteval", "仅支持标量类型的常量初始化"));
}
ConstEvalVisitor visitor(table_, ctx_);
if (dims.empty()) {
return {EvaluateScalarInit(init, elem_type, visitor)};
}
const size_t total = Product(dims, 0);
std::vector<ConstValue> flattened(total, MakeZeroValue(elem_type));
FillConstArrayObject(init, 0, 0, total, dims, elem_type, flattened, visitor);
return flattened;
}

File diff suppressed because it is too large Load Diff

@ -2,16 +2,54 @@
#include "sem/SymbolTable.h"
void SymbolTable::Add(const std::string& name,
SysYParser::VarDefContext* decl) {
table_[name] = decl;
#include <stdexcept>
SymbolTable::SymbolTable() { EnterScope(); }
void SymbolTable::EnterScope() { scopes_.emplace_back(); }
void SymbolTable::ExitScope() {
if (scopes_.size() <= 1) {
throw std::runtime_error("symbol table scope underflow");
}
scopes_.pop_back();
}
bool SymbolTable::Insert(const SymbolEntry* symbol) {
if (!symbol) {
return false;
}
if (scopes_.empty()) {
EnterScope();
}
auto& current = scopes_.back();
auto [it, inserted] = current.emplace(symbol->name, symbol);
return inserted;
}
bool SymbolTable::Contains(const std::string& name) const {
return table_.find(name) != table_.end();
return Lookup(name) != nullptr;
}
bool SymbolTable::ContainsCurrentScope(const std::string& name) const {
return LookupCurrentScope(name) != nullptr;
}
const SymbolEntry* SymbolTable::Lookup(const std::string& name) const {
for (auto it = scopes_.rbegin(); it != scopes_.rend(); ++it) {
auto symbol_it = it->find(name);
if (symbol_it != it->end()) {
return symbol_it->second;
}
}
return nullptr;
}
SysYParser::VarDefContext* SymbolTable::Lookup(const std::string& name) const {
auto it = table_.find(name);
return it == table_.end() ? nullptr : it->second;
const SymbolEntry* SymbolTable::LookupCurrentScope(
const std::string& name) const {
if (scopes_.empty()) {
return nullptr;
}
auto it = scopes_.back().find(name);
return it == scopes_.back().end() ? nullptr : it->second;
}

@ -0,0 +1,95 @@
# 今日工作总结2026-04-02
## 1. 今天做了什么
- 核查语义分析实现与当前 `SysY.g4` 的兼容性。
- 重构语义分析流程,使其对齐当前语法节点(如 `block`、`stmt`、`lVal` 等)。
- 实现并接入编译期常量求值模块(`ConstEval`),覆盖常量表达式与 const 初始化列表展平。
- 将符号表升级为 IR 导向的 `SymbolEntry` 结构,并支持作用域查找。
- 增加语义绑定上下文,支持左值使用点与函数调用使用点绑定。
- 分别验证了子模块构建状态与完整 IRGen 链路构建状态。
- 定位了为何 `sem` 目标通过但全量构建失败。
## 2. 已实现内容
### 语义分析(`sema`
- 函数预声明与函数体语义检查流程。
- 赋值、返回、条件表达式、一元/二元运算的类型检查。
- 变量/常量/形参的作用域检查。
- `break` / `continue` 的循环上下文合法性检查。
- `main` 函数存在性与签名检查。
### 符号表
- 作用域栈(`EnterScope` / `ExitScope`)。
- 当前作用域与嵌套作用域查找逻辑。
- IR 导向符号信息(`kind`、`data_type`、数组维度、常量初始化载荷)。
### ConstEval
- 常量标量求值(支持 int/float/bool 转换)。
- 常量表达式访问器求值。
- 数组维度合法性校验(必须为整数且大于 0
- const 初始化列表展平(支持嵌套花括号和零填充)。
## 3. 今日验证与排查结果
- `cmake --build build --target sem -j4`:通过。
- `cmake --build build --target irgen -j4`:失败。
已定位根因:
- `include/ir/IR.h``src/ir/*.cpp` 尚未完全对齐(函数签名不一致、重复定义、内联方法中的不完整类型使用)。
- `IRGen` 仍在使用旧 parser 上下文与旧语义接口(`ResolveVarUse`),而当前 sema 接口是 `ResolveLValUse` / `ResolveCallUse`
## 4. 今天修改的文件
### 核心代码变更
- `include/sem/Sema.h`
- `include/sem/SymbolTable.h`
- `include/sem/ConstEval.h`(新增)
- `src/sem/Sema.cpp`
- `src/sem/SymbolTable.cpp`
- `src/sem/ConstEval.cpp`
### 观察到的其他仓库变更
- `scripts/lab1_build_test.sh`(文件权限位变化)
- `介绍.md`(新增)
- Lab1 输出文件变更:
- `output/lab1/01_mm2.tree`
- `output/lab1/02_mv3.tree`
- `output/lab1/03_sort1.tree`
- `output/lab1/05_arr_defn4.tree`
- `output/lab1/09_func_defn.tree`
- `output/lab1/11_add2.tree`
- `output/lab1/13_sub2.tree`
- `output/lab1/15_graph_coloring.tree`
- `output/lab1/2025-MYO-20.tree`
- `output/lab1/22_matrix_multiply.tree`
- `output/lab1/25_scope3.tree`
- `output/lab1/29_break.tree`
- `output/lab1/36_op_priority2.tree`
- `output/lab1/95_float.tree`
- `output/lab1/fft0.tree`
- `output/lab1/gameoflife-oscillator.tree`
- `output/lab1/if-combine3.tree`
- `output/lab1/large_loop_array_2.tree`
- `output/lab1/simple_add.tree`
- `output/lab1/transpose0.tree`
- `output/lab1/vector_mul3.tree`
## 5. 当前阻塞点
- IR 核心实现尚未与最新 `IR.h` 契约完全同步。
- IRGen 适配层尚未迁移到当前 grammar / API 契约。
- `include/sem/ConstEval.h` 中目前存在错误 include 记号(`<str ing>`),在全链路稳定前需要修复。
## 6. 下一步建议
1. 按 `include/ir/IR.h` 逐项对齐 `src/ir/BasicBlock.cpp`、`src/ir/Function.cpp`、`src/ir/Module.cpp`。
2. 将 `IR.h` 中依赖完整 `BasicBlock` / `Function` 类型的高风险内联方法迁移到 `.cpp`(如有必要)。
3. 迁移 IRGen 访问器与语义绑定调用到当前 parser 与 sema API。
4. 重新执行全量构建,再跑 `lab1` / `lab2` 脚本做端到端验证。

@ -0,0 +1,215 @@
# 项目目录与文件说明nudt-compiler-cpp
本文用于快速理解本仓库中各目录、子模块和关键文件的职责,方便 Lab1-Lab6 分工协作与联调。
## 1. 项目总体结构
仓库采用典型的 C++ 工程布局:
- include头文件定义模块对外接口
- src源文件给出具体实现
- doc课程实验说明文档
- test测试输入输出用例
- scripts自动化验证脚本
- third_party第三方依赖ANTLR jar 与 C++ runtime
- sylib运行时库评测常用
- output示例输出当前主要是 Lab1 语法树结果)
## 2. 根目录关键文件
### CMakeLists.txt
根构建入口,负责:
- 设置 C++17 与编译选项
- 配置可执行文件输出路径build/bin
- 配置 ANTLR 生成目录build/generated/antlr4
- 构建 third_party 下的 antlr4 runtime 静态库
- 进入 src 子目录继续构建
### README.md
项目总说明与实验流程文档,包含:
- Lab1-Lab6 任务定位
- 环境依赖安装
- Lexer/Parser 生成命令
- parse-only 与全量构建方式
- verify_ir 与 verify_asm 的验证方式
## 3. include 目录(接口层)
include 下每个子目录一般对应 src 同名实现目录。
### include/frontend
- AntlrDriver.h封装词法/语法分析驱动,输入源文件得到 ANTLR 语法树
- SyntaxTreePrinter.h语法树打印接口Lab1 主要使用)
### include/sem
- Sema.h语义分析入口与语义上下文结构
- SymbolTable.h符号表接口与符号条目定义你当前负责的核心
### include/ir
- IR.hIR 核心设计接口Type、Value、Instruction、BasicBlock、Function、Module、IRBuilder 等)
- IR_org.h历史/参考版本,通常不作为当前主实现接口
- utils.hIR 相关工具定义
### include/irgen
- IRGen.h语法树到 IR 的生成器接口,连接 sem 与 ir
### include/mir
- MIR.h机器中间表示与后端流程接口Lowering、RegAlloc、AsmPrinter 等)
### include/utils
- CLI.h命令行参数解析
- Log.h统一错误与日志输出工具
## 4. src 目录(实现层)
### src/main.cpp
编译器主流程入口,串联如下阶段:
1. 解析命令行参数
2. 前端解析得到语法树
3. 调用 sem 语义分析
4. 调用 irgen 生成 IR
5. 可选:调用 mir 生成汇编
说明:在 COMPILER_PARSE_ONLY=ON 时,仅保留前端语法树链路。
### src/antlr4
- SysY.g4SysY 词法与语法规则定义
- .antlrANTLR 辅助文件目录
这是前端的语法来源Lab1 和 Lab2 都会依赖它。
### src/frontend
- AntlrDriver.cppANTLR 解析流程实现
- SyntaxTreePrinter.cpp语法树打印实现
- CMakeLists.txtfrontend 模块构建脚本
### src/sem
- Sema.cpp语义检查实现名字绑定、合法性检查等
- SymbolTable.cpp符号表实现作用域、插入、查找等
- ConstEval.cpp常量求值相关逻辑
- CMakeLists.txtsem 模块构建脚本
### src/ir
IR 数据结构与构建器的实现目录:
- Type.cpp类型系统
- Value.cppValue 与 use-def 基础
- Instruction.cpp指令实现
- BasicBlock.cpp基本块
- Function.cpp函数
- Module.cpp模块
- IRBuilder.cppIR 构建辅助接口
- IRPrinter.cppIR 文本输出
- Context.cppIR 上下文(常量池、临时名等)
- GlobalValue.cpp全局值实现
子目录:
- analysis中端分析如 DominatorTree、LoopInfo
- passes中端优化 pass如 Mem2Reg、DCE、CSE、ConstProp、CFGSimplify
### src/irgen
语法树到 IR 的翻译实现:
- IRGenDriver.cppIR 生成入口
- IRGenFunc.cpp函数相关生成
- IRGenDecl.cpp声明相关生成
- IRGenStmt.cpp语句相关生成
- IRGenExp.cpp表达式相关生成
### src/mir
IR 到机器表示/汇编的后端流程实现:
- Lowering.cpp从 IR 降到 MIR
- RegAlloc.cpp寄存器分配
- FrameLowering.cpp栈帧处理
- AsmPrinter.cpp汇编输出
- MIRContext.cpp、MIRFunction.cpp、MIRBasicBlock.cpp、MIRInstr.cpp、Register.cppMIR 核心结构
子目录:
- passes后端 pass例如 Peephole
### src/utils
- CLI.cpp命令行参数逻辑
- Log.cpp错误格式化与打印
## 5. doc 目录(实验文档)
- Lab1-语法树构建.mdLab1 指南
- Lab2-中间表示生成.mdLab2 指南
- Lab3-Lab6 文档:后续阶段说明
- imagesREADME 与文档中的配图
## 6. test 目录(测试用例)
- test/test_case/functional功能正确性用例
- test/test_case/performance性能类/规模类用例
每个用例通常有:
- .sySysY 源程序
- .in输入可选
- .out期望输出
## 7. scripts 目录(自动化验证)
- lab1_build_test.shLab1 构建/测试辅助脚本
- lab2_build_test.shLab2 构建/测试辅助脚本
- verify_ir.shIR 链路验证脚本(可运行并对比输出)
- verify_asm.sh汇编链路验证脚本可运行并对比输出
## 8. third_party 目录(外部依赖)
- antlr-4.13.2-complete.jarANTLR 工具
- antlr4-runtime-4.13.2ANTLR C++ runtime 源码与 CMake
## 9. sylib 目录(运行时库)
- sylib.c
- sylib.h
用于编译与运行 SysY 程序时提供运行时支持函数。
## 10. output 目录(阶段产物示例)
当前可见 output/lab1 下的 .tree 文件,主要是语法树输出结果样例。
注意:正常开发与验证时,实际构建产物通常在 build 目录,不依赖 output 目录作为输入。
## 11. 模块依赖关系(简图)
前端 frontend 输出语法树,交给 sem 做语义绑定,再由 irgen 生成 ir最后 mir 负责后端。
- frontend -> sem -> irgen -> mir
- utils 被多个模块复用
- ir 是 irgen 与 mir 的共同基础
## 12. 对你当前分工(符号表设计)的定位
你主要工作在 include/sem 与 src/sem
- 设计 SymbolEntry 与 SymbolTable 的接口和作用域规则
- 让 Sema 输出可被 IR 生成阶段直接消费的语义绑定结果
- 与 include/ir/IR.h 的实体类型Type、Value、Function对接
这样可以实现 IR 导向设计:符号表条目直接关联 IR 实体句柄,后续 IR 生成同学只需按该契约回填与读取。
Loading…
Cancel
Save