⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fooparser.cpp

📁 用于词法分析的词法分析器
💻 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 + -