forked from NUDT-compiler/nudt-compiler-cpp
Compare commits
1 Commits
master
...
zwz-compil
| Author | SHA1 | Date |
|---|---|---|
|
|
12c217e5f9 | 7 days ago |
@ -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
Loading…
Reference in new issue