We have to step up to a GLR parser to do this without exceptions (for no reason other than Bison happens to use exceptions for the LALR(1) template and not for the GLR one), but this should let us smooth out integration going forward. Change-Id: Iff44662914b4a65dfa5612d07c3a1ede07e6e4a9 Signed-off-by: Casey Dahlin <sadmac@google.com>
88 lines
1.9 KiB
C++
88 lines
1.9 KiB
C++
#include "aidl_language.h"
|
|
#include "aidl_language_y.hpp"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
#include <iostream>
|
|
|
|
using std::string;
|
|
using std::cerr;
|
|
using std::endl;
|
|
|
|
ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks;
|
|
|
|
void yylex_init(void **);
|
|
void yylex_destroy(void *);
|
|
void yyset_in(FILE *f, void *);
|
|
int yyparse(ParseState*);
|
|
|
|
ParseState::ParseState() : ParseState("") {}
|
|
|
|
ParseState::ParseState(const string& filename)
|
|
: filename_(filename) {
|
|
yylex_init(&scanner_);
|
|
}
|
|
|
|
ParseState::~ParseState() {
|
|
yylex_destroy(scanner_);
|
|
}
|
|
|
|
string ParseState::FileName() {
|
|
return filename_;
|
|
}
|
|
|
|
string ParseState::Package() {
|
|
return g_currentPackage;
|
|
}
|
|
|
|
void ParseState::ProcessDocument(const document_item_type& items) {
|
|
/* The cast is not my fault. I didn't write the code on the other side. */
|
|
/* TODO(sadmac): b/23977313 */
|
|
g_callbacks->document((document_item_type *)&items);
|
|
}
|
|
|
|
void ParseState::ProcessImport(const buffer_type& statement) {
|
|
/* The cast is not my fault. I didn't write the code on the other side. */
|
|
/* TODO(sadmac): b/23977313 */
|
|
g_callbacks->import((buffer_type *)&statement);
|
|
}
|
|
|
|
void ParseState::ReportError(const string& err) {
|
|
/* FIXME: We're printing out the line number as -1. We used to use yylineno
|
|
* (which was NEVER correct even before reentrant parsing). Now we'll need
|
|
* another way.
|
|
*/
|
|
cerr << filename_ << ":" << -1 << ": " << err << endl;
|
|
error_ = 1;
|
|
}
|
|
|
|
bool ParseState::FoundNoErrors() {
|
|
return error_ == 0;
|
|
}
|
|
|
|
void *ParseState::Scanner() {
|
|
return scanner_;
|
|
}
|
|
|
|
bool ParseState::OpenFileFromDisk() {
|
|
FILE *in = fopen(FileName().c_str(), "r");
|
|
|
|
if (! in)
|
|
return false;
|
|
|
|
yyset_in(in, Scanner());
|
|
return true;
|
|
}
|
|
|
|
int ParseState::RunParser() {
|
|
int ret = yy::parser(this).parse();
|
|
|
|
free((void *)g_currentPackage);
|
|
g_currentPackage = NULL;
|
|
|
|
if (error_)
|
|
return 1;
|
|
|
|
return ret;
|
|
}
|