ANTLR4学习笔记--TLexer

照旧先贴代码。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”的功能。

C++ 类和对象(上)------超详细解析,小白必看系列-CSDN博客

【C++】类的默认成员函数----const成员函数(超详细解析)_c++ const函数-CSDN博客

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值