| #include "aidl_language.h" |
| |
| #include <iostream> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string> |
| |
| #include "aidl_language_y.hpp" |
| #include "parse_helpers.h" |
| |
| #ifdef _WIN32 |
| int isatty(int fd) |
| { |
| return (fd == 0); |
| } |
| #endif |
| |
| using std::string; |
| using std::cerr; |
| using std::endl; |
| |
| Parser *psGlobal = NULL; |
| ParserCallbacks* g_callbacks = NULL; // &k_parserCallbacks; |
| char const* g_currentPackage = NULL; |
| |
| |
| void yylex_init(void **); |
| void yylex_destroy(void *); |
| void yyset_in(FILE *f, void *); |
| int yyparse(Parser*); |
| |
| Parser::Parser(const string& filename) |
| : filename_(filename) { |
| yylex_init(&scanner_); |
| } |
| |
| Parser::~Parser() { |
| yylex_destroy(scanner_); |
| } |
| |
| string Parser::FileName() { |
| return filename_; |
| } |
| |
| string Parser::Package() { |
| return g_currentPackage ? g_currentPackage : ""; |
| } |
| |
| void Parser::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 Parser::FoundNoErrors() { |
| return error_ == 0; |
| } |
| |
| void *Parser::Scanner() { |
| return scanner_; |
| } |
| |
| bool Parser::OpenFileFromDisk() { |
| FILE *in = fopen(FileName().c_str(), "r"); |
| |
| if (! in) |
| return false; |
| |
| yyset_in(in, Scanner()); |
| return true; |
| } |
| |
| bool Parser::RunParser() { |
| int ret = yy::parser(this).parse(); |
| |
| free((void *)g_currentPackage); |
| g_currentPackage = NULL; |
| |
| return ret == 0 && error_ == 0; |
| } |
| |
| void Parser::SetDocument(document_item_type *d) |
| { |
| document_ = d; |
| } |
| |
| void Parser::AddImport(const buffer_type& statement) |
| { |
| import_info* import = (import_info*)malloc(sizeof(import_info)); |
| memset(import, 0, sizeof(import_info)); |
| import->from = strdup(this->FileName().c_str()); |
| import->statement.lineno = statement.lineno; |
| import->statement.data = strdup(statement.data); |
| import->statement.extra = NULL; |
| import->next = imports_; |
| import->neededClass = android::aidl::parse_import_statement(statement.data); |
| imports_ = import; |
| } |
| |
| document_item_type *Parser::GetDocument() const |
| { |
| return document_; |
| } |
| |
| import_info *Parser::GetImports() const |
| { |
| return imports_; |
| } |