146 lines
3.5 KiB
C++
146 lines
3.5 KiB
C++
//===-- GoParser.h -----------------------------------------------*- C++
|
|
//-*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_GoParser_h
|
|
#define liblldb_GoParser_h
|
|
|
|
#include "Plugins/ExpressionParser/Go/GoAST.h"
|
|
#include "Plugins/ExpressionParser/Go/GoLexer.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
namespace lldb_private {
|
|
class GoParser {
|
|
public:
|
|
explicit GoParser(const char *src);
|
|
|
|
GoASTStmt *Statement();
|
|
|
|
GoASTStmt *GoStmt();
|
|
GoASTStmt *ReturnStmt();
|
|
GoASTStmt *BranchStmt();
|
|
GoASTStmt *EmptyStmt();
|
|
GoASTStmt *ExpressionStmt(GoASTExpr *e);
|
|
GoASTStmt *IncDecStmt(GoASTExpr *e);
|
|
GoASTStmt *Assignment(GoASTExpr *e);
|
|
GoASTBlockStmt *Block();
|
|
|
|
GoASTExpr *MoreExpressionList(); // ["," Expression]
|
|
GoASTIdent *MoreIdentifierList(); // ["," Identifier]
|
|
|
|
GoASTExpr *Expression();
|
|
GoASTExpr *UnaryExpr();
|
|
GoASTExpr *OrExpr();
|
|
GoASTExpr *AndExpr();
|
|
GoASTExpr *RelExpr();
|
|
GoASTExpr *AddExpr();
|
|
GoASTExpr *MulExpr();
|
|
GoASTExpr *PrimaryExpr();
|
|
GoASTExpr *Operand();
|
|
GoASTExpr *Conversion();
|
|
|
|
GoASTExpr *Selector(GoASTExpr *e);
|
|
GoASTExpr *IndexOrSlice(GoASTExpr *e);
|
|
GoASTExpr *TypeAssertion(GoASTExpr *e);
|
|
GoASTExpr *Arguments(GoASTExpr *e);
|
|
|
|
GoASTExpr *Type();
|
|
GoASTExpr *Type2();
|
|
GoASTExpr *ArrayOrSliceType(bool allowEllipsis);
|
|
GoASTExpr *StructType();
|
|
GoASTExpr *FunctionType();
|
|
GoASTExpr *InterfaceType();
|
|
GoASTExpr *MapType();
|
|
GoASTExpr *ChanType();
|
|
GoASTExpr *ChanType2();
|
|
|
|
GoASTExpr *Name();
|
|
GoASTExpr *QualifiedIdent(GoASTIdent *p);
|
|
GoASTIdent *Identifier();
|
|
|
|
GoASTField *FieldDecl();
|
|
GoASTExpr *AnonymousFieldType();
|
|
GoASTExpr *FieldNamesAndType(GoASTField *f);
|
|
|
|
GoASTFieldList *Params();
|
|
GoASTField *ParamDecl();
|
|
GoASTExpr *ParamType();
|
|
GoASTFuncType *Signature();
|
|
GoASTExpr *CompositeLit();
|
|
GoASTExpr *FunctionLit();
|
|
GoASTExpr *Element();
|
|
GoASTCompositeLit *LiteralValue();
|
|
|
|
bool Failed() const { return m_failed; }
|
|
bool AtEOF() const {
|
|
return m_lexer.BytesRemaining() == 0 && m_pos == m_tokens.size();
|
|
}
|
|
|
|
void GetError(Status &error);
|
|
|
|
private:
|
|
class Rule;
|
|
friend class Rule;
|
|
|
|
std::nullptr_t syntaxerror() {
|
|
m_failed = true;
|
|
return nullptr;
|
|
}
|
|
GoLexer::Token &next() {
|
|
if (m_pos >= m_tokens.size()) {
|
|
if (m_pos != 0 && (m_tokens.back().m_type == GoLexer::TOK_EOF ||
|
|
m_tokens.back().m_type == GoLexer::TOK_INVALID))
|
|
return m_tokens.back();
|
|
m_pos = m_tokens.size();
|
|
m_tokens.push_back(m_lexer.Lex());
|
|
}
|
|
return m_tokens[m_pos++];
|
|
}
|
|
GoLexer::TokenType peek() {
|
|
GoLexer::Token &tok = next();
|
|
--m_pos;
|
|
return tok.m_type;
|
|
}
|
|
GoLexer::Token *match(GoLexer::TokenType t) {
|
|
GoLexer::Token &tok = next();
|
|
if (tok.m_type == t)
|
|
return &tok;
|
|
--m_pos;
|
|
m_last_tok = t;
|
|
return nullptr;
|
|
}
|
|
GoLexer::Token *mustMatch(GoLexer::TokenType t) {
|
|
GoLexer::Token *tok = match(t);
|
|
if (tok)
|
|
return tok;
|
|
return syntaxerror();
|
|
}
|
|
bool Semicolon();
|
|
|
|
GoASTStmt *FinishStmt(GoASTStmt *s) {
|
|
if (!Semicolon())
|
|
m_failed = true;
|
|
return s;
|
|
}
|
|
|
|
llvm::StringRef CopyString(llvm::StringRef s);
|
|
|
|
GoLexer m_lexer;
|
|
std::vector<GoLexer::Token> m_tokens;
|
|
size_t m_pos;
|
|
llvm::StringRef m_error;
|
|
llvm::StringRef m_last;
|
|
GoLexer::TokenType m_last_tok;
|
|
llvm::StringMap<uint8_t> m_strings;
|
|
bool m_failed;
|
|
};
|
|
}
|
|
|
|
#endif
|