照旧先贴代码。TLexer.h:
/* lexer header section */
// Generated from TLexer.g4 by ANTLR 4.9.1
#pragma once
/* lexer precinclude section */
#include "antlr4-runtime.h"
/* lexer postinclude section */
#ifndef _WIN32
#pragma GCC diagnostic ignored "-Wunused-parameter"
#endif
namespace antlrcpptest {
/* lexer context section */
class TLexer : public antlr4::Lexer {
public:
enum {
DUMMY = 1, Return = 2, Continue = 3, INT = 4, Digit = 5, ID = 6, LessThan = 7,
GreaterThan = 8, Equal = 9, And = 10, Colon = 11, Semicolon = 12, Plus = 13,
Minus = 14, Star = 15, OpenPar = 16, ClosePar = 17, OpenCurly = 18,
CloseCurly = 19, QuestionMark = 20, Comma = 21, String = 22, Foo = 23,
Bar = 24, Any = 25, Comment = 26, WS = 27, Dot = 28, DotDot = 29, Dollar = 30,
Ampersand = 31
};
enum {
CommentsChannel = 2, DirectiveChannel = 3
};
enum {
Mode1 = 1, Mode2 = 2
};
explicit TLexer(antlr4::CharStream *input);
~TLexer();
/* public lexer declarations section */
bool canTestFoo() { return true; }
bool isItFoo() { return true; }
bool isItBar() { return true; }
void myFooLexerAction() { /* do something*/ };
void myBarLexerAction() { /* do something*/ };
virtual std::string getGrammarFileName() const override;
virtual const std::vector<std::string>& getRuleNames() const override;
virtual const std::vector<std::string>& getChannelNames() const override;
virtual const std::vector<std::string>& getModeNames() const override;
virtual const std::vector<std::string>& getTokenNames() const override; // deprecated, use vocabulary instead
virtual antlr4::dfa::Vocabulary& getVocabulary() const override;
virtual const std::vector<uint16_t> getSerializedATN() const override;
virtual const antlr4::atn::ATN& getATN() const override;
virtual void action(antlr4::RuleContext *context, size_t ruleIndex, size_t actionIndex) override;
virtual bool sempred(antlr4::RuleContext *_localctx, size_t ruleIndex, size_t predicateIndex) override;
private:
static std::vector<antlr4::dfa::DFA> _decisionToDFA;
static antlr4::atn::PredictionContextCache _sharedContextCache;
static std::vector<std::string> _ruleNames;
static std::vector<std::string> _tokenNames;
static std::vector<std::string> _channelNames;
static std::vector<std::string> _modeNames;
static std::vector<std::string> _literalNames;
static std::vector<std::string> _symbolicNames;
static antlr4::dfa::Vocabulary _vocabulary;
static antlr4::atn::ATN _atn;
static std::vector<uint16_t> _serializedATN;
/* private lexer declarations/members section */
// Individual action functions triggered by action() above.
void FooAction(antlr4::RuleContext *context, size_t actionIndex);
void BarAction(antlr4::RuleContext *context, size_t actionIndex);
// Individual semantic predicate functions triggered by sempred() above.
bool FooSempred(antlr4::RuleContext *_localctx, size_t predicateIndex);
bool BarSempred(antlr4::RuleContext *_localctx, size_t predicateIndex);
struct Initializer {
Initializer();
};
static Initializer _init;
};
} // namespace antlrcpptest
TLexer.cpp太长了,就不全贴上来了。
学习期间遇到一些问题,上网查阅资料后解决:
关于explicit
explicit作用是防止编译器进行隐式类型转换,只允许显式调用构造函数进行对象的创建。C++中explicit的用法_explicit c++-CSDN博客
介绍一下隐式类型转换和显式类型转换:
隐式类型转换:
- 在编译器自动执行的情况下,将一种数据类型转换为另一种数据类型,而无需显式地指定转换操作。
- 发生在不同数据类型之间,编译器会自动将一种类型转换为另一种类型,以便进行操作或赋值。
- 通常会发生在赋值、函数参数传递和表达式求值等情况下。
- 隐式类型转换可能会导致意外的行为和错误,因此需要谨慎使用。
int a = 10;
double b = a; // 隐式将整数转换为浮点数
显式类型转换:
- 通过显式指定转换操作来将一种数据类型转换为另一种数据类型。
- 开发人员明确指定了转换操作,提高了代码的可读性和可维护性。
- 显式类型转换可以使用多种语法形式,如 C 风格的类型转换
(type)value
或者 C++ 的static_cast<type>(value)
、dynamic_cast<type>(value)
等。
double x = 3.14;
int y = static_cast<int>(x); // 显式将浮点数转换为整数
总的来说,隐式类型转换是由编译器自动执行的,而显式类型转换则是由开发人员明确指定的。
关于class成员函数const关键词
C++有隐含this指针:在成员函数的参数中,会隐含有Data* const this。this指针是一个隐含的形参this指针本身不能修改,因为它是const修饰的,但是this指针指向的对象可以被修改。如下
class Date
{
public:
//Print处理前
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
//Print处理后
void Print(Data* const this) //注意const修饰,指针不能修改,指向的内容可以修改
{
cout << this->_year << "-" << this->_month << "-" << this > _day << endl;
}
//Init处理前
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
//Init处理后
void Init(Date* const this, int year, int month, int day)
{
this->_year = year;
this->_month = month;
this->_day = day;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
如果想要this指针指向的对象不可以被修改,就要加上const关键词,而我们不能显式地声明const Data* const this,所以C++支持在函数声明后加上关键词const来实现“const Data* const this”的功能。