2. 对于C/C++、Java等语言,代码是否缩进以及如何缩进对程序的执行逻辑没有任何影响,但为何还要强调缩进的重要性?
时间: 2024-03-30 16:35:12 浏览: 27
虽然代码缩进不会影响程序的执行逻辑,但它对代码的可读性和可维护性有着很大的影响。缩进可以让代码结构更加清晰,便于读者理解代码的逻辑结构和执行流程,也方便后期的代码维护和修改。此外,在团队开发中,统一的缩进风格可以使代码更加规范,有利于提高代码的质量和效率。
在不同的编程语言和编程规范中,通常都有相应的缩进规范和风格指南。例如,C++的缩进规范可以遵循Google C++ 编程风格,Java的缩进规范可以遵循Google Java 编程风格等。因此,编写代码时应该注意缩进的规范和风格,以提高代码的可读性和可维护性。
相关问题
将QT += core QT -= gui CONFIG += c++11 TARGET = UavRectifyLoadLIb CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS win32{ CONFIG(debug, debug|release){ DESTDIR = $$PWD/../../../../RasterManager/bin/Debug } else{ DESTDIR = $$PWD/../../../../RasterManager/bin/release } INCLUDEPATH += $$PWD/../../../include/gdal1101 DEPENDPATH += $$PWD/../../../include/gdal1101 } else{ CONFIG(debug, debug|release){ DESTDIR = $$PWD/../../../product/release32 } else{ DESTDIR = $$PWD/../../../product/release32 } } # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lUAVAutoRectifyMt -lUAVAutoRectify -lUAVAutoRectifyFi INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_core unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_highgui unix:!macx: LIBS += -L$$PWD/../../../lib/opencvf249/ -lopencv_imgproc INCLUDEPATH += $$PWD/../../../lib/opencvf249 DEPENDPATH += $$PWD/../../../lib/opencvf249 unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_core #unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_highgui unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_imgproc unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_features2d unix:!macx: LIBS += -L$$PWD/../../../../../../../usr/local/lib/ -lopencv_imgcodecs INCLUDEPATH += $$PWD/../../../../../../../usr/local/include DEPENDPATH += $$PWD/../../../../../../../usr/local/include unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lDEMDriver unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lProjection unix:!macx: LIBS += -L$$PWD/../../../product/release32/ -lIImage_gC QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO 转为cmake格式
根据给出的代码,可以将其转化为以下CMake代码:
```
cmake_minimum_required(VERSION 3.5)
project(UavRectifyLoadLIb LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt5Core REQUIRED)
add_executable(UavRectifyLoadLIb
main.cpp
)
target_link_libraries(UavRectifyLoadLIb
PRIVATE
Qt5::Core
UAVAutoRectifyMt
UAVAutoRectify
UAVAutoRectifyFi
DEMDriver
Projection
IImage_gC
opencv_core
opencv_highgui
opencv_imgproc
opencv_features2d
opencv_imgcodecs
)
target_include_directories(UavRectifyLoadLIb
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../../../include/gdal1101
${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/opencvf249
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../usr/local/include
)
if(UNIX AND NOT APPLE)
target_link_directories(UavRectifyLoadLIb
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../../../product/release32
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../../usr/local/lib
)
endif()
if(WIN32)
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set_target_properties(UavRectifyLoadLIb PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../../../RasterManager/bin/Debug
)
else()
set_target_properties(UavRectifyLoadLIb PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../../RasterManager/bin/release
)
endif()
else()
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set_target_properties(UavRectifyLoadLIb PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../../product/release32
)
else()
set_target_properties(UavRectifyLoadLIb PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../product/release32
)
endif()
endif()
```
使用C/C++语言编写PL/0编译程序的语义分析程序,并生成四元式形式的中间代码
PL/0编译程序主要包含了词法分析、语法分析和语义分析三个部分。语法分析阶段通常会生成语法树作为中间结果,而语义分析阶段则会对语法树进行遍历,进行类型检查、作用域检查和代码生成等操作。
下面是一个示例代码,演示如何使用C++语言编写PL/0编译程序的语义分析程序,并生成四元式形式的中间代码:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
// Token类,表示词法分析的结果
class Token {
public:
enum class Type {
Identifier,
Number,
Operator,
Keyword,
Delimiter,
EndOfFile
};
Token(Type type, string value): type_(type), value_(value) {}
Type type() const { return type_; }
string value() const { return value_; }
private:
Type type_;
string value_;
};
// 符号表项类,表示一个变量或常量的信息
class Symbol {
public:
enum class Type {
Variable,
Constant
};
Symbol(Type type, string name, int level, int address, int value = 0)
: type_(type), name_(name), level_(level), address_(address), value_(value) {}
Type type() const { return type_; }
string name() const { return name_; }
int level() const { return level_; }
int address() const { return address_; }
int value() const { return value_; }
private:
Type type_;
string name_;
int level_;
int address_;
int value_;
};
// 四元式类,表示中间代码的一条指令
class Quadruple {
public:
enum class Operator {
Add,
Sub,
Mul,
Div,
Assign,
Load,
Store,
Push,
Pop,
Jmp,
JmpIf,
JmpIfNot,
Call,
Ret
};
Quadruple(Operator op, string arg1, string arg2, string result)
: op_(op), arg1_(arg1), arg2_(arg2), result_(result) {}
Operator op() const { return op_; }
string arg1() const { return arg1_; }
string arg2() const { return arg2_; }
string result() const { return result_; }
private:
Operator op_;
string arg1_;
string arg2_;
string result_;
};
// PL/0编译程序类,包含词法分析、语法分析和语义分析等功能
class Compiler {
public:
Compiler(string source): source_(source) {}
void compile() {
// 词法分析
tokenize();
// 语法分析
parse();
// 语义分析
analyze();
// 代码生成
generate();
}
private:
// 词法分析部分
void tokenize() {
// TODO: 实现词法分析部分
}
// 语法分析部分
void parse() {
// TODO: 实现语法分析部分
}
// 语义分析部分
void analyze() {
// 初始化符号表
symbols_.push_back(Symbol(Symbol::Type::Variable, "", 0, 0)); // 空符号表
// 遍历语法树,进行类型检查、作用域检查和代码生成
analyzeNode(root_);
}
// 对语法树节点进行语义分析
void analyzeNode(Node* node) {
if (node->type == Node::Type::Program) {
// 程序节点,遍历子节点
for (auto child : node->children) {
analyzeNode(child);
}
} else if (node->type == Node::Type::Block) {
// 块节点,进入新的作用域并遍历子节点
enterScope();
for (auto child : node->children) {
analyzeNode(child);
}
exitScope();
} else if (node->type == Node::Type::VarDecl) {
// 变量声明节点,将变量添加到符号表中
for (auto child : node->children) {
if (child->type == Node::Type::Identifier) {
string name = child->token.value();
int address = allocate();
symbols_.push_back(Symbol(Symbol::Type::Variable, name, currentLevel(), address));
}
}
} else if (node->type == Node::Type::ConstDecl) {
// 常量声明节点,将常量添加到符号表中
for (auto child : node->children) {
if (child->type == Node::Type::Identifier) {
string name = child->token.value();
int value = stoi(child->sibling->token.value());
symbols_.push_back(Symbol(Symbol::Type::Constant, name, currentLevel(), 0, value));
}
}
} else if (node->type == Node::Type::AssignStmt) {
// 赋值语句节点,生成赋值指令
string varName = node->token.value();
Symbol* symbol = findSymbol(varName);
if (symbol == nullptr) {
error("Undefined variable: " + varName);
}
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::Assign, pop(), "", symbol->name()));
} else if (node->type == Node::Type::ReadStmt) {
// 读取语句节点,生成读取指令
string varName = node->token.value();
Symbol* symbol = findSymbol(varName);
if (symbol == nullptr) {
error("Undefined variable: " + varName);
}
quadruples_.push_back(Quadruple(Quadruple::Operator::Load, "", "", "stdin"));
quadruples_.push_back(Quadruple(Quadruple::Operator::Store, pop(), "", symbol->name()));
} else if (node->type == Node::Type::WriteStmt) {
// 输出语句节点,生成输出指令
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::Load, "", "", "stdout"));
quadruples_.push_back(Quadruple(Quadruple::Operator::Push, pop(), "", ""));
quadruples_.push_back(Quadruple(Quadruple::Operator::Call, "", "", "print"));
} else if (node->type == Node::Type::IfStmt) {
// 条件语句节点,生成条件跳转指令
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::JmpIfNot, pop(), "", ""));
analyzeNode(node->children[1]);
} else if (node->type == Node::Type::IfElseStmt) {
// 条件语句(含有else分支)节点,生成条件跳转指令和无条件跳转指令
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::JmpIfNot, pop(), "", ""));
analyzeNode(node->children[1]);
int label1 = allocateLabel();
quadruples_.push_back(Quadruple(Quadruple::Operator::Jmp, "", "", toLabel(label1)));
setLabel(label1);
analyzeNode(node->children[2]);
} else if (node->type == Node::Type::WhileStmt) {
// 循环语句节点,生成条件跳转指令和无条件跳转指令
int label1 = allocateLabel();
setLabel(label1);
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::JmpIfNot, pop(), "", ""));
analyzeNode(node->children[1]);
quadruples_.push_back(Quadruple(Quadruple::Operator::Jmp, "", "", toLabel(label1)));
} else if (node->type == Node::Type::CallStmt) {
// 调用语句节点,生成调用指令
string funcName = node->token.value();
quadruples_.push_back(Quadruple(Quadruple::Operator::Call, "", "", funcName));
} else if (node->type == Node::Type::ReturnStmt) {
// 返回语句节点,生成返回指令
analyzeNode(node->children[0]);
quadruples_.push_back(Quadruple(Quadruple::Operator::Ret, "", "", ""));
} else if (node->type == Node::Type::Expression) {
// 表达式节点,生成表达式指令
analyzeExpression(node);
} else if (node->type == Node::Type::Identifier) {
// 标识符节点,生成加载指令
string varName = node->token.value();
Symbol* symbol = findSymbol(varName);
if (symbol == nullptr) {
error("Undefined variable: " + varName);
}
quadruples_.push_back(Quadruple(Quadruple::Operator::Load, "", "", symbol->name()));
push(symbol->name());
} else if (node->type == Node::Type::Number) {
// 数字节点,生成常量指令
int value = stoi(node->token.value());
string name = toConstant(value);
quadruples_.push_back(Quadruple(Quadruple::Operator::Load, "", "", name));
push(name);
} else if (node->type == Node::Type::Operator) {
// 运算符节点,生成运算指令
analyzeExpression(node);
}
}
// 对表达式节点进行语义分析
void analyzeExpression(Node* node) {
if (node->type == Node::Type::Expression) {
analyzeExpression(node->children[0]);
if (node->children.size() == 3) {
analyzeExpression(node->children[2]);
string arg2 = pop();
string arg1 = pop();
string result = newTemp();
switch (node->children[1]->token.type()) {
case Token::Type::Operator:
switch (node->children[1]->token.value()[0]) {
case '+':
quadruples_.push_back(Quadruple(Quadruple::Operator::Add, arg1, arg2, result));
break;
case '-':
quadruples_.push_back(Quadruple(Quadruple::Operator::Sub, arg1, arg2, result));
break;
case '*':
quadruples_.push_back(Quadruple(Quadruple::Operator::Mul, arg1, arg2, result));
break;
case '/':
quadruples_.push_back(Quadruple(Quadruple::Operator::Div, arg1, arg2, result));
break;
}
break;
case Token::Type::Keyword:
if (node->children[1]->token.value() == "and") {
quadruples_.push_back(Quadruple(Quadruple::Operator::Mul, arg1, arg2, result));
} else if (node->children[1]->token.value() == "or") {
quadruples_.push_back(Quadruple(Quadruple::Operator::Add, arg1, arg2, result));
quadruples_.push_back(Quadruple(Quadruple::Operator::Push, result, "", ""));
quadruples_.push_back(Quadruple(Quadruple::Operator::Load, "", "", toConstant(0)));
quadruples_.push_back(Quadruple(Quadruple::Operator::JmpIfNot, pop(), "", ""));
quadruples_.push_back(Quadruple(Quadruple::Operator::Push, toConstant(1), "", ""));