/*
* Copyright 2001-2007 Adrian Thurston <thurston@complang.org>
*/
/* This file is part of Ragel.
*
* Ragel is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Ragel is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Ragel; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _RLPARSE_H
#define _RLPARSE_H
#include <iostream>
#include "avltree.h"
#include "parsedata.h"
/* Import scanner tokens. */
#define IMP_Word 128
#define IMP_Literal 129
#define IMP_UInt 130
#define IMP_Define 131
/* This is used for tracking the include files/machine pairs. */
struct IncludeHistoryItem
{
IncludeHistoryItem( const char *fileName, const char *sectionName )
: fileName(fileName), sectionName(sectionName) {}
const char *fileName;
const char *sectionName;
};
typedef Vector<IncludeHistoryItem> IncludeHistory;
struct Parser
{
%%{
parser Parser;
# General tokens.
token TK_Word, TK_Literal, TK_Number, TK_EndSection, TK_UInt, TK_Hex,
TK_Word, TK_Literal, TK_DotDot, TK_ColonGt, TK_ColonGtGt, TK_LtColon,
TK_Arrow, TK_DoubleArrow, TK_StarStar, TK_ColonEquals, TK_NameSep,
TK_BarStar, TK_DashDash;
# Conditions.
token TK_StartCond, TK_AllCond, TK_LeavingCond;
# State embedding actions.
token TK_Middle;
# Global error actions.
token TK_StartGblError, TK_AllGblError, TK_FinalGblError,
TK_NotFinalGblError, TK_NotStartGblError, TK_MiddleGblError;
# Local error actions.
token TK_StartLocalError, TK_AllLocalError, TK_FinalLocalError,
TK_NotFinalLocalError, TK_NotStartLocalError, TK_MiddleLocalError;
# EOF Action embedding.
token TK_StartEOF, TK_AllEOF, TK_FinalEOF, TK_NotFinalEOF, TK_NotStartEOF,
TK_MiddleEOF;
# To State Actions.
token TK_StartToState, TK_AllToState, TK_FinalToState, TK_NotFinalToState,
TK_NotStartToState, TK_MiddleToState;
# In State Actions.
token TK_StartFromState, TK_AllFromState, TK_FinalFromState,
TK_NotFinalFromState, TK_NotStartFromState, TK_MiddleFromState;
# Regular expression tokens. */
token RE_Slash, RE_SqOpen, RE_SqOpenNeg, RE_SqClose, RE_Dot, RE_Star,
RE_Dash, RE_Char;
# Tokens specific to inline code.
token IL_WhiteSpace, IL_Comment, IL_Literal, IL_Symbol;
# Keywords.
token KW_Machine, KW_Include, KW_Import, KW_Write, KW_Action, KW_AlphType,
KW_Range, KW_GetKey, KW_Include, KW_Write, KW_Machine, KW_InWhen,
KW_When, KW_OutWhen, KW_Eof, KW_Err, KW_Lerr, KW_To, KW_From,
KW_Export, KW_PrePush, KW_PostPop, KW_Length;
# Specials in code blocks.
token KW_Break, KW_Exec, KW_Hold, KW_PChar, KW_Char, KW_Goto, KW_Call,
KW_Ret, KW_CurState, KW_TargState, KW_Entry, KW_Next, KW_Exec,
KW_Variable, KW_Access;
}%%
%% write instance_data;
void init();
int parseLangEl( int type, const Token *token );
Parser( const char *fileName, char *sectionName, InputLoc §ionLoc )
: sectionName(sectionName)
{
pd = new ParseData( fileName, sectionName, sectionLoc );
exportContext.append( false );
includeHistory.append( IncludeHistoryItem(
fileName, sectionName ) );
}
int token( InputLoc &loc, int tokId, char *tokstart, int toklen );
void tryMachineDef( InputLoc &loc, char *name,
MachineDef *machineDef, bool isInstance );
/* Report an error encountered by the parser. */
ostream &parse_error( int tokId, Token &token );
ParseData *pd;
/* The name of the root section, this does not change during an include. */
char *sectionName;
NameRef nameRef;
NameRefList nameRefList;
Vector<bool> exportContext;
IncludeHistory includeHistory;
Parser *prev, *next;
};
%% write token_defs;
#endif