📄 elexscanner.cpp
字号:
/* $Id: ElexScanner.cpp,v 1.9 1997/05/18 10:58:17 matt Exp $ Elex script scanner class. (c) 1996 Matt Phillips. */#include <ctype.h>#include <util/checks.h>#include "ElexScanner.h"struct KeyWord{ char *name; int symbol;};static KeyWord keyWords [] = { {"scanner", ElexScanner::SymScanner}, {"symbols", ElexScanner::SymSymbols}, {"defines", ElexScanner::SymDefines}, {"begin", ElexScanner::SymBegin}, {"end", ElexScanner::SymEnd}, {"on", ElexScanner::SymOn}, {0, 0} // sentinel};void ElexScanner::getString (){ input.clearBuffer (); while (input.peek () != '"') { if (input.eof ()) { error ("unterminated string"); break; } if (input.peek () == '\\') input.get (); input.get (); } input.skip (); // lose terminating "}void ElexScanner::getIdent (){ while (isalnum (input.peek ()) || input.peek () == '_') { input.get (); } // is it a keyword? symbol = SymIdent; string str (getText ()); for (KeyWord *keyword = keyWords; keyword->name; keyword++) { if (keyword->name == str) { symbol = keyword->symbol; break; } }}void ElexScanner::getNext (){ input.clearBuffer (); // skip whitespace/comments for (;;) { if (isspace (input.peek ())) { input.skip (); } else if (input.peek () == '#') { while (!input.inState (input.getState (), InputStream::stEndLine)) { input.skip (); } input.skip (); } else break; }; symLine = input.getLine (); symCol = input.getColumn (); if (!input.eof ()) { if (isalpha (input.peek ())) { getIdent (); } else { int chr = input.peek (); input.get (); switch (chr) { case ':': symbol = SymColon; break; case '=': symbol = SymEquals; break; case ',': symbol = SymComma; break; case '<': symbol = SymLessThan; break; case '"': symbol = SymString; getString (); break; default: input.get (); error ("illegal symbol"); } } } else { symbol = SymEOF; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -