📄 elexscanner.h
字号:
/* $Id: ElexScanner.h,v 1.9 1997/03/19 12:16:02 matt Exp $ Default Elex scanner class. (c) Matt Phillips 1996. */#ifndef _ELEX_SCAN_H#define _ELEX_SCAN_H#include <std/string.h>#include <compiler/ErrorMessage.h>#include <contain/CircularQueue.h>#include "XInputStream.h"#include "ElexScannerBase.h"class ElexScanner : public ElexScannerBase{public: ElexScanner (ElexScannerData &d, XInputStream &i, int lookahead = 1); XInputStream &getInput () {return input;} virtual int getNext (); virtual string &getText () {return text;} virtual const string &getText () const {return text;} int getTextLine () const {return symbolLine;} int getTextColumn () const {return symbolColumn;} virtual void error (const string &message); virtual void warning (const string &message); const ErrorMessageList &getErrors () const {return errors;}protected: // mark used to allow scanner to backtrack. class BacktrackMark { public: BacktrackMark () {} // place mark at current point in s. void mark (const ElexScanner &s); // sets stream to be at this mark. void jump (ElexScanner &s) const; int isValid (const ElexScanner &s) const { return streamMark.isValid (s.input); } protected: XInputStream::BacktrackMark streamMark; const ElexState *state; int symbolCount; }; // mark used to mark the start/end of symbols in the stream. class SymbolMark { public: int production; XInputStream::BacktrackMark mark; int markCount; int operator > (const SymbolMark &m) const {return mark > m.mark;} }; // used to store frozen symbols. class Symbol { public: string text; int production; int line, column; }; typedef CircularQueue<SymbolMark> SymbolMarkStack; typedef CircularQueue<BacktrackMark> BacktrackMarkStack; typedef CircularQueue<Symbol> SymbolStack; const ElexState *state; XInputStream &input; ErrorMessageList errors; string text; int symbolLine, symbolColumn; int lookahead; BacktrackMarkStack marks; // backtrack marks SymbolMarkStack symbolMarks; // currently matched symbols SymbolMarkStack bestMatch; // the best match so far SymbolStack symbols; // frozen symbols static const ElexState eofState; // used to reprsent EOF condition void reset (); void primeSymbols (); void handleNoAccept (); void mark (); void freeze (SymbolMarkStack &symbolMarkStack); void makeCurrent (const Symbol &sym); int backtrack (); void match (int production); virtual int invokeProduction (int i) = 0; friend class ElexScanner::BacktrackMark;};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -