📄 fooparser.cpp
字号:
/* $Id: FooParser.cpp,v 1.3 1997/02/02 01:31:01 matt Exp $ FooParser class. (c) 1996 Matt Phillips. */#include <util/checks.h>#include "FooParser.h"#define ArraySize(a) (sizeof (a) / sizeof (*(a)))FooParser::FooParser (BufferedInputStream &i) : scanner (i, errors), baseObject (0){ scanner.getNext (); // cue scanner baseObject = parseObject ();}FooObject *FooParser::parseObject (){ FooObject *object; if (scanner.getSymbol () == FooScanner::SymString) { object = new FooObject (scanner.getText ()); scanner.getNext (); } else { mustbe (FooScanner::SymLBracket); object = new FooObject; parseAttrs (*object); mustbe (FooScanner::SymRBracket); } return object;}void FooParser::parseAttrs (FooObject &object){ while (scanner.getSymbol () == FooScanner::SymIdent && !scanner.eof ()) { string attr (scanner.getText ()); scanner.getNext (); if (have (FooScanner::SymLSBracket)) { FooObject::Objects &values = object.getOrCreateAttrs (attr); while (!scanner.eof () && (scanner.getSymbol () == FooScanner::SymLBracket || scanner.getSymbol () == FooScanner::SymString)) { values.addTail (*parseObject ()); } mustbe (FooScanner::SymRSBracket); } else { object.addAttr (attr, *parseObject ()); } }}void FooParser::mustbeError (int sym){ static char *errStrs [] = { "(", "missing ')'", "[", "missing ']'", "identfier expected" }; CHECK (sym >= 0 && sym < ArraySize (errStrs), "mustbeError symbol out of range"); error (errStrs [sym]);}int FooParser::mustbe (int sym){ if (scanner.getSymbol () != sym) { mustbeError (sym); return 0; } else { scanner.getNext (); return 1; }}int FooParser::have (int sym){ if (scanner.getSymbol () != sym) return 0; else { scanner.getNext (); return 1; }}void FooParser::error (const char *msg){ errors.error (string (msg), scanner.getInput ().getFilename (), scanner.getSymbolLine (), scanner.getSymbolColumn ());}void FooParser::warning (const char *msg){ errors.warning (string (msg), scanner.getInput ().getFilename (), scanner.getSymbolLine (), scanner.getSymbolColumn ());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -