hlsl2glslfork/hlslang/MachineIndependent/hlslang.l

531 строка
22 KiB
C++

/*-*-C++-*-
// Copyright (c) The HLSL2GLSLFork Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE.txt file.
*/
/* Based on
ANSI C grammar, Lex specification
In 1985, Jeff Lee published this Lex specification together with a Yacc
grammar for the April 30, 1985 ANSI C draft. Tom Stockfisch reposted
both to net.sources in 1987; that original, as mentioned in the answer
to question 17.25 of the comp.lang.c FAQ, can be ftp'ed from ftp.uu.net,
file usenet/net.sources/ansi.c.grammar.Z.
I intend to keep this version as close to the current C Standard grammar
as possible; please let me know if you discover discrepancies.
Jutta Degener, 1995
*/
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
O [0-7]
F [hHfF]
I [uUlL]
%option nounput
%{
#include <stdio.h>
#include <stdlib.h>
#include "ParseHelper.h"
#include "hlslang_tab.h"
/* windows only pragma */
#ifdef _MSC_VER
#pragma warning(disable : 4102)
#endif
int yy_input(char* buf, int max_size);
static TSourceLoc lexlineno = { 0, 0 };
#ifdef _WIN32
extern int yyparse(TParseContext&);
#define YY_DECL int yylex(YYSTYPE* pyylval, TParseContext& parseContext)
#else
extern int yyparse(void*);
#define YY_DECL int yylex(YYSTYPE* pyylval, void* parseContextLocal)
#define parseContext (*((TParseContext*)(parseContextLocal)))
#endif
#define YY_INPUT(buf,result,max_size) (result = yy_input(buf, max_size))
%}
%option noyywrap
%option never-interactive
%option outfile="Gen_hlslang.cpp"
%x FIELDS
%%
<*>"//"[^\n]*"\n" { /* ?? carriage and/or line-feed? */ };
"const" { pyylval->lex.line = lexlineno; return(CONST_QUAL); }
"static" { pyylval->lex.line = lexlineno; return(STATIC_QUAL); }
"uniform" { pyylval->lex.line = lexlineno; return(UNIFORM); }
"break" { pyylval->lex.line = lexlineno; return(BREAK); }
"continue" { pyylval->lex.line = lexlineno; return(CONTINUE); }
"do" { pyylval->lex.line = lexlineno; return(DO); }
"for" { pyylval->lex.line = lexlineno; return(FOR); }
"while" { pyylval->lex.line = lexlineno; return(WHILE); }
"if" { pyylval->lex.line = lexlineno; return(IF); }
"else" { pyylval->lex.line = lexlineno; return(ELSE); }
"in" { pyylval->lex.line = lexlineno; return(IN_QUAL); }
"out" { pyylval->lex.line = lexlineno; return(OUT_QUAL); }
"inout" { pyylval->lex.line = lexlineno; return(INOUT_QUAL); }
"float" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FLOAT_TYPE); }
"float1" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FLOAT_TYPE); }
"int" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(INT_TYPE); }
"int1" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(INT_TYPE); }
"void" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(VOID_TYPE); }
"bool" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(BOOL_TYPE); }
"bool1" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(BOOL_TYPE); }
"string" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(STRING_TYPE); }
"true" { pyylval->lex.line = lexlineno; pyylval->lex.b = true; return(BOOLCONSTANT); }
"false" { pyylval->lex.line = lexlineno; pyylval->lex.b = false; return(BOOLCONSTANT); }
"discard" { pyylval->lex.line = lexlineno; return(DISCARD); }
"return" { pyylval->lex.line = lexlineno; return(RETURN); }
"float2x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX2x2); }
"float2x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX2x3); }
"float2x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX2x4); }
"float3x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX3x2); }
"float3x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX3x3); }
"float3x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX3x4); }
"float4x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX4x2); }
"float4x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX4x3); }
"float4x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(MATRIX4x4); }
"half2x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX2x2); }
"half2x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX2x3); }
"half2x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX2x4); }
"half3x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX3x2); }
"half3x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX3x3); }
"half3x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX3x4); }
"half4x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX4x2); }
"half4x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX4x3); }
"half4x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HMATRIX4x4); }
"fixed2x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX2x2); }
"fixed2x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX2x3); }
"fixed2x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX2x4); }
"fixed3x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX3x2); }
"fixed3x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX3x3); }
"fixed3x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX3x4); }
"fixed4x2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX4x2); }
"fixed4x3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX4x3); }
"fixed4x4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FMATRIX4x4); }
"half" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HALF_TYPE); }
"half1" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(HALF_TYPE); }
"half2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (HVEC2); }
"half3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (HVEC3); }
"half4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (HVEC4); }
"fixed" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FIXED_TYPE); }
"fixed1" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return(FIXED_TYPE); }
"fixed2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (FVEC2); }
"fixed3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (FVEC3); }
"fixed4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (FVEC4); }
"float2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (VEC2); }
"float3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (VEC3); }
"float4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (VEC4); }
"int2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (IVEC2); }
"int3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (IVEC3); }
"int4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (IVEC4); }
"bool2" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (BVEC2); }
"bool3" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (BVEC3); }
"bool4" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (BVEC4); }
"vector" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (VECTOR); }
"matrix" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (MATRIX); }
"register" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return (REGISTER); }
"sampler1D" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER1D; }
"sampler1DShadow" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER1DSHADOW; }
"sampler2D" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER2D; }
"sampler2DShadow" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER2DSHADOW; }
"sampler2D_half" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER2D_HALF; }
"sampler2D_float" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER2D_FLOAT; }
"sampler3D" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLER3D; }
"samplerRECT" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERRECT; }
"samplerRECTShadow" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERRECTSHADOW; }
"sampler" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERGENERIC; }
"samplerCUBE" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERCUBE; }
"samplerCUBE_half" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERCUBE_HALF; }
"samplerCUBE_float" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERCUBE_FLOAT; }
"texture" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return TEXTURE; }
"texture2D" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return TEXTURE; }
"texture3D" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return TEXTURE; }
"textureRECT" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return TEXTURE; }
"textureCUBE" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return TEXTURE; }
"sampler_state" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = true; return SAMPLERSTATE; }
"struct" { pyylval->lex.line = lexlineno; return(STRUCT); }
"asm" { PaReservedWord(); return 0; }
"class" { PaReservedWord(); return 0; }
"union" { PaReservedWord(); return 0; }
"enum" { PaReservedWord(); return 0; }
"typedef" { PaReservedWord(); return 0; }
"template" { PaReservedWord(); return 0; }
"this" { PaReservedWord(); return 0; }
"packed" { PaReservedWord(); return 0; }
"goto" { PaReservedWord(); return 0; }
"switch" { PaReservedWord(); return 0; }
"default" { PaReservedWord(); return 0; }
"inline" { /* just ignore it PaReservedWord(); return 0; */ }
"noinline" { /* just ignore it PaReservedWord(); return 0; */ }
"volatile" { PaReservedWord(); return 0; }
"public" { PaReservedWord(); return 0; }
"extern" { PaReservedWord(); return 0; }
"external" { PaReservedWord(); return 0; }
"interface" { PaReservedWord(); return 0; }
"long" { PaReservedWord(); return 0; }
"short" { PaReservedWord(); return 0; }
"double" { PaReservedWord(); return 0; }
"unsigned" { PaReservedWord(); return 0; }
"sampler3DRect" { PaReservedWord(); return 0; }
"sizeof" { PaReservedWord(); return 0; }
"cast" { PaReservedWord(); return 0; }
"namespace" { PaReservedWord(); return 0; }
"using" { PaReservedWord(); return 0; }
{L}({L}|{D})* {
pyylval->lex.line = lexlineno;
pyylval->lex.string = NewPoolTString(yytext);
return PaIdentOrType(*pyylval->lex.string, parseContext, pyylval->lex.symbol);
}
{D}+{E}{F}? { pyylval->lex.line = lexlineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
{D}+"."{D}*({E})?{F}? { pyylval->lex.line = lexlineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
"."{D}+({E})?{F}? { pyylval->lex.line = lexlineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
{D}+{F} { pyylval->lex.line = lexlineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
0[xX]{H}+{I}? { pyylval->lex.line = lexlineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
0{O}+{I}? { pyylval->lex.line = lexlineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
0{D}+{I}? { pyylval->lex.line = lexlineno; parseContext.error(lexlineno, "Invalid Octal number.", yytext, "", ""); parseContext.recover(); return 0;}
{D}+{I}? { pyylval->lex.line = lexlineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
"/*" { int ret = PaParseComment(pyylval->lex.line, parseContext); if (!ret) return ret; }
"+=" { pyylval->lex.line = lexlineno; return(ADD_ASSIGN); }
"-=" { pyylval->lex.line = lexlineno; return(SUB_ASSIGN); }
"*=" { pyylval->lex.line = lexlineno; return(MUL_ASSIGN); }
"/=" { pyylval->lex.line = lexlineno; return(DIV_ASSIGN); }
"%=" { pyylval->lex.line = lexlineno; return(MOD_ASSIGN); }
"<<=" { pyylval->lex.line = lexlineno; return(LEFT_ASSIGN); }
">>=" { pyylval->lex.line = lexlineno; return(RIGHT_ASSIGN); }
"&=" { pyylval->lex.line = lexlineno; return(AND_ASSIGN); }
"^=" { pyylval->lex.line = lexlineno; return(XOR_ASSIGN); }
"|=" { pyylval->lex.line = lexlineno; return(OR_ASSIGN); }
"++" { pyylval->lex.line = lexlineno; return(INC_OP); }
"--" { pyylval->lex.line = lexlineno; return(DEC_OP); }
"&&" { pyylval->lex.line = lexlineno; return(AND_OP); }
"||" { pyylval->lex.line = lexlineno; return(OR_OP); }
"^^" { pyylval->lex.line = lexlineno; return(XOR_OP); }
"<=" { pyylval->lex.line = lexlineno; return(LE_OP); }
">=" { pyylval->lex.line = lexlineno; return(GE_OP); }
"==" { pyylval->lex.line = lexlineno; return(EQ_OP); }
"!=" { pyylval->lex.line = lexlineno; return(NE_OP); }
"<<" { pyylval->lex.line = lexlineno; return(LEFT_OP); }
">>" { pyylval->lex.line = lexlineno; return(RIGHT_OP); }
";" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = false; return(SEMICOLON); }
"{" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = false; return(LEFT_BRACE); }
"}" { pyylval->lex.line = lexlineno; return(RIGHT_BRACE); }
"," { pyylval->lex.line = lexlineno; if (parseContext.inTypeParen) parseContext.lexAfterType = false; return(COMMA); }
":" { pyylval->lex.line = lexlineno; return(COLON); }
"=" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = false; return(EQUAL); }
"(" { pyylval->lex.line = lexlineno; parseContext.lexAfterType = false; parseContext.inTypeParen = true; return(LEFT_PAREN); }
")" { pyylval->lex.line = lexlineno; parseContext.inTypeParen = false; return(RIGHT_PAREN); }
"[" { pyylval->lex.line = lexlineno; return(LEFT_BRACKET); }
"]" { pyylval->lex.line = lexlineno; return(RIGHT_BRACKET); }
"." { BEGIN(FIELDS); return(DOT); }
"!" { pyylval->lex.line = lexlineno; return(BANG); }
"-" { pyylval->lex.line = lexlineno; return(DASH); }
"~" { pyylval->lex.line = lexlineno; return(TILDE); }
"+" { pyylval->lex.line = lexlineno; return(PLUS); }
"*" { pyylval->lex.line = lexlineno; return(STAR); }
"/" { pyylval->lex.line = lexlineno; return(SLASH); }
"%" { pyylval->lex.line = lexlineno; return(PERCENT); }
"<" { pyylval->lex.line = lexlineno; return(LEFT_ANGLE); }
">" { pyylval->lex.line = lexlineno; return(RIGHT_ANGLE); }
"|" { pyylval->lex.line = lexlineno; return(VERTICAL_BAR); }
"^" { pyylval->lex.line = lexlineno; return(CARET); }
"&" { pyylval->lex.line = lexlineno; return(AMPERSAND); }
"?" { pyylval->lex.line = lexlineno; return(QUESTION); }
\"[^\"]*\" { pyylval->lex.line = lexlineno; return(STRINGCONSTANT); }
<FIELDS>{L}({L}|{D})* {
BEGIN(INITIAL);
pyylval->lex.line = lexlineno;
pyylval->lex.string = NewPoolTString(yytext);
return FIELD_SELECTION; }
<FIELDS>[ \t\v\f\r] {}
[ \t\v\n\f\r] { }
<*><<EOF>> { (&parseContext)->AfterEOF = true; yy_delete_buffer(YY_CURRENT_BUFFER); yyterminate();}
<*>. { parseContext.infoSink.info << "FLEX: Unknown char " << yytext << "\n";
return 0; }
%%
//Including Pre-processor.
extern "C" {
#include "./preprocessor/preprocess.h"
}
//
// The YY_INPUT macro just calls this. Maybe this could be just put into
// the macro directly.
//
int yy_input(char* buf, int max_size)
{
int len;
if ((len = yylex_CPP(buf, max_size)) == 0)
return 0;
if (len >= max_size)
YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
//debug code to dump the token stream to stdout
//buf[len] = '\0';
//printf( ":: %s\n", buf);
buf[len] = ' ';
return len+1;
}
//
// Parse an array of strings using yyparse. We set up globals used by
// yywrap.
//
// Returns 0 for success, as per yyparse().
//
int PaParseString(char* source, TParseContext& parseContextLocal)
{
int sourceLen;
ScanFromString(source);
//Storing the Current Compiler Parse context into the cpp structure.
cpp->pC = (void*)&parseContextLocal;
if (!source) {
parseContextLocal.error(gNullSourceLoc, "Null shader source string", "", "");
parseContextLocal.recover();
return 1;
}
sourceLen = (int) strlen(source);
yyrestart(0);
(&parseContextLocal)->AfterEOF = false;
lexlineno.file = NULL;
lexlineno.line = 1;
if (sourceLen >= 0) {
int ret;
#ifdef _WIN32
ret = yyparse(parseContextLocal);
#else
ret = yyparse((void*)(&parseContextLocal));
#endif
if (cpp->CompileError == 1 || parseContextLocal.recoveredFromError || parseContextLocal.numErrors > 0)
return 1;
else
return 0;
}
else
return 0;
}
void yyerror(const char *s)
{
if (((TParseContext *)cpp->pC)->AfterEOF) {
if (cpp->tokensBeforeEOF == 1) {
GlobalParseContext->error(lexlineno, "syntax error", "pre-mature EOF", s, "");
GlobalParseContext->recover();
}
} else {
GlobalParseContext->error(lexlineno, "syntax error", yytext, s, "");
GlobalParseContext->recover();
}
}
void PaReservedWord()
{
GlobalParseContext->error(lexlineno, "Reserved word.", yytext, "", "");
GlobalParseContext->recover();
}
int PaIdentOrType(TString& id, TParseContext& parseContextLocal, TSymbol*& symbol)
{
symbol = parseContextLocal.symbolTable.find(id);
if (parseContextLocal.lexAfterType == false && symbol && symbol->isVariable()) {
TVariable* variable = static_cast<TVariable*>(symbol);
if (variable->isUserType()) {
parseContextLocal.lexAfterType = true;
return TYPE_NAME;
}
}
return IDENTIFIER;
}
int PaParseComment(TSourceLoc &lineno, TParseContext& parseContextLocal)
{
int transitionFlag = 0;
int nextChar;
while (transitionFlag != 2) {
nextChar = yyinput();
if (nextChar == '\n')
lineno.line++;
switch (nextChar) {
case '*' :
transitionFlag = 1;
break;
case '/' : /* if star is the previous character, then it is the end of comment */
if (transitionFlag == 1) {
return 1 ;
}
break;
case EOF :
/* Raise error message here */
parseContextLocal.error(lexlineno, "End of shader found before end of comment.", "", "", "");
GlobalParseContext->recover();
return YY_NULL;
default : /* Any other character will be a part of the comment */
transitionFlag = 0;
}
}
return 1;
}
extern "C" {
void CPPWarningToInfoLog(const char *msg)
{
((TParseContext *)cpp->pC)->infoSink.info.message(EPrefixWarning, msg, lexlineno);
}
void CPPShInfoLogMsg(const char *msg)
{
((TParseContext *)cpp->pC)->error(lexlineno,"", "",msg,"");
GlobalParseContext->recover();
}
void CPPErrorToInfoLog(char *msg)
{
((TParseContext *)cpp->pC)->error(lexlineno,"syntax error", "",msg,"");
GlobalParseContext->recover();
}
void SetLineNumber(TSourceLoc line)
{
lexlineno.file = NULL;
lexlineno.line = line.line;
if(line.file && line.file[0])
{
// GLSL does not permit quoted strings in #line directives
if(line.file[0] == '"')
{
TString stripped(line.file + 1);
size_t len = stripped.size();
if(stripped[len - 1] == '"')
{
stripped.resize(len - 1);
}
lexlineno.file = NewPoolTString(stripped.c_str())->c_str();
}
else
{
lexlineno.file = NewPoolTString(line.file)->c_str();
}
}
}
const TSourceLoc GetLineNumber(void)
{
return lexlineno;
}
void IncLineNumber(void)
{
++lexlineno.line;
}
void DecLineNumber(void)
{
if (lexlineno.line > 0)
--lexlineno.line;
}
void StoreStr(char *string)
{
TString strSrc;
strSrc = TString(string);
((TParseContext *)cpp->pC)->HashErrMsg = ((TParseContext *)cpp->pC)->HashErrMsg + " " + strSrc;
}
const char* GetStrfromTStr(void)
{
cpp->ErrMsg = (((TParseContext *)cpp->pC)->HashErrMsg).c_str();
return cpp->ErrMsg;
}
void ResetTString(void)
{
((TParseContext *)cpp->pC)->HashErrMsg = "";
}
} // extern "C"
void setInitialState()
{
yy_start = 1;
}