blob: 803685e246d9e042abd1d2972ebde0a9643c295c [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <memory>
#include "ast.h"
#include "lexer.h"
namespace fidl {
class Parser {
public:
explicit Parser(Lexer* lexer)
: lexer_(lexer) {
last_token_ = Lex();
}
std::unique_ptr<File> Parse() {
return ParseFile();
}
bool Ok() const {
return ok_;
}
private:
Token Lex() {
return lexer_->LexNoComments();
}
Token::Kind Peek() {
return last_token_.kind();
}
Token Consume() {
auto token = last_token_;
last_token_ = Lex();
return token;
}
Token ConsumeToken(Token::Kind kind) {
auto token = Consume();
if (token.kind() != kind)
Fail();
return token;
}
bool MaybeConsumeToken(Token::Kind kind) {
if (Peek() == kind) {
auto token = Consume();
static_cast<void>(token);
assert(token.kind() == kind);
return true;
} else {
return false;
}
}
decltype(nullptr) Fail() {
ok_ = false;
return nullptr;
}
std::unique_ptr<Identifier> ParseIdentifier();
std::unique_ptr<CompoundIdentifier> ParseCompoundIdentifier();
std::unique_ptr<StringLiteral> ParseStringLiteral();
std::unique_ptr<NumericLiteral> ParseNumericLiteral();
std::unique_ptr<TrueLiteral> ParseTrueLiteral();
std::unique_ptr<FalseLiteral> ParseFalseLiteral();
std::unique_ptr<DefaultLiteral> ParseDefaultLiteral();
std::unique_ptr<Literal> ParseLiteral();
std::unique_ptr<Constant> ParseConstant();
std::unique_ptr<Using> ParseUsing();
std::unique_ptr<ArrayType> ParseArrayType();
std::unique_ptr<VectorType> ParseVectorType();
std::unique_ptr<StringType> ParseStringType();
std::unique_ptr<HandleType> ParseHandleType();
std::unique_ptr<PrimitiveType> ParsePrimitiveType();
std::unique_ptr<RequestType> ParseRequestType();
std::unique_ptr<Type> ParseType();
std::unique_ptr<ConstDeclaration> ParseConstDeclaration();
std::unique_ptr<EnumMember> ParseEnumMember();
std::unique_ptr<EnumDeclaration> ParseEnumDeclaration();
std::unique_ptr<Parameter> ParseParameter();
std::unique_ptr<ParameterList> ParseParameterList();
std::unique_ptr<InterfaceMemberMethod> ParseInterfaceMemberMethod();
std::unique_ptr<InterfaceDeclaration> ParseInterfaceDeclaration();
std::unique_ptr<StructMember> ParseStructMember();
std::unique_ptr<StructDeclaration> ParseStructDeclaration();
std::unique_ptr<UnionMember> ParseUnionMember();
std::unique_ptr<UnionDeclaration> ParseUnionDeclaration();
std::unique_ptr<File> ParseFile();
Lexer* lexer_;
Token last_token_;
bool ok_ = true;
};
} // namespace fidl