Files
harbour-core/harbour/samples/cccppc/hparser.prg
1999-11-09 01:37:27 +00:00

1542 lines
52 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* $Id$
*/
//*******************************************************************
// hparser.prg: Hessmark parser(1): a '#'-al kezd𡞫<64> sorok elemz<6D>e.
// 1999, Csisz<73> Levente
/*
1999.05.15
- #define, #xtranslate elemz<6D>e.
1999.04.22
- Elemzi a #define sorokat, <20> a makr▎at elhelyezi egy
sz┤<7A>ban.
- Ami nincs:
1. Az error tokeneket ki kellene v饊ogatni, <20> a v<><76>
odatenni az output-ra.
2. A cr-lf-et most m<> az inputon (az creader:read()-ban
lf-re konvert饊ja, mert a parsebuffer οra sz<73>szedi
cr karakterre <20> lf karakterre.
Ez nem j<>, m坟ik megold坟t kell keresni.
3. A t𥿡bi # utas﹀坟t implement饊ni kell.
4. A #define makr▎ v<>rehajt坟慯 meg kell 〉ni
(nem felt<6C>len<65> itt!)
*/
//*******************************************************************
#include "objgen.ch"
//*******************************************************************
#define _STRICT_PARENT_
#include "token.och"
#include "mmarker.och"
#include "rmarker.och"
#include "maltrset.och"
#include "rsmmarkr.och"
#include "ralter.och"
// #include "edefdict.och"
// #include "defdict.och"
#include "extrdict.och"
#include "xtrdict.och"
// #include "freader.och"
#include "incl.och"
#include "prserr.och"
//*******************************************************************
// #include "cr_lf.ch"
#include "ctoken.ch"
// #include "prserr.ch"
//*******************************************************************
#include "hparser.ch"
//*******************************************************************
#define _HPARSER_PRG_
#define _IMPLEMENT_ONEW_
#include "hparser.och"
#undef ID_STRING
//*******************************************************************
// 䏭szehasonl﹀ja a this:item-et egy karaterrel.
#define eqItemChar(aChar) (valtype(this:item)=="C" .and. ;
this:item==(aChar))
//*******************************************************************
implement oinit(inputReader,name,defDict,xtrDict,inclObj,errorStream)
super:oinit(inputReader,name,errorStream)
this:soreleje:=.t.
// this:errorItem:=nil
this:defdict:=defDict//C.DEFDICT:onew()
this:xtrdict:=xtrDict//C.XTRDICT:onew()
this:ifStack:={}
this:branch:=.t.
this:inclObj:=inclObj
// this:errorStream:=errorStream
return this
//*******************************************************************
cimplement oinitclass()
C.PRSERR:registerError(HPRERR_INVALIDMN ,;
"Invalid name follows '#': $1")
C.PRSERR:registerError(HPRERR_SDEFINE ,;
"Syntax error in #define")
C.PRSERR:registerError(HPRERR_LDEFINE ,;
"Label missing in #define")
C.PRSERR:registerError(HPRERR_PDEFINE ,;
"Comma or right parenthesis missing in #define")
C.PRSERR:registerError(HPRERR_SUNDEF ,;
"Error in #undef"/*"Label missing in #undef"*/)
C.PRSERR:registerError(HPRERR_MDUPLICATE ,;
"Duplicate #define: $1, $2")
C.PRSERR:registerError(HPRERR_SXTRANSLATE,;
"Syntax error in #xtranslate/#xcommand/#translate/#command")
C.PRSERR:registerError(HPRERR_XTRANSLATEEOL,;
"Not expected end of line in #xtranslate/#xcommand/#translate/#command")
C.PRSERR:registerError(HPRERR_XTRRNESTED,;
"Nested [] in the right side of #xtranslate/#xcommand/#translate/#command")
C.PRSERR:registerError(HPRERR_XTRLUNCLOSED,;
"Unclosed [] in the left side of #xtranslate/#xcommand/#translate/#command")
C.PRSERR:registerError(HPRERR_XTRUNDEFRM,;
"Result marker not found in #xtranslate/#xcommand/#translate/#command's match markers: $0")
C.PRSERR:registerError(HPRERR_IFDEFNL ,;
"Label missing in #ifdef/#ifndef")
C.PRSERR:registerError(HPRERR_SIFDEF ,;
"Syntax error in #ifdef/#ifndef")
C.PRSERR:registerError(HPRERR_ELSE ,;
"#else does not match #if")
C.PRSERR:registerError(HPRERR_ELSE2 ,;
"Duplicated #else")
C.PRSERR:registerError(HPRERR_ENDIF ,;
"#endif does not match #if")
C.PRSERR:registerError(HPRERR_ENDIFMISSING,;
"#endif missing at end of file")
C.PRSERR:registerError(HPRERR_INCLUDE ,;
"Bad or missing filename in #include")
C.PRSERR:registerError(HPRERR_INCLUDEOPEN,;
"Can't open include file: $1")
C.PRSERR:registerError(HPRERR_INCLUDEFIND,;
"Can't find include file: $1")
C.PRSERR:registerError(HPRERR_INCLUDENEST,;
"Too many nested include: $1")
C.PRSERR:registerError(HPRERR_USER,;
"#error $1")
return class
//*******************************************************************
implement readItem()
local w,tkId,tkStr
/*
Olvasunk a pufferb𢡠. Ha ki<6B><69>t, akkor:
- ha sorelej<65> vagyunk, akkor h」juk a parseLine()-t.
Ez a sorv<72>jelet mindig a pufferben hagyja, hacsak nincs v<>e
a fil<69>ek.
- ha sor k瑨ep<65> vagyunk, akkor olvasunk, <20> megn<67>z<EFBFBD>, hogy sor
v<><76>e jutottunk-e.
Probl<62>a: Ha egy fil<69> lez<65>unk, <20> van benne lez<65>atlan if,
akkor nem ad hibajelz<6C>t.
*/
if (nil!=(w:=this:getParserBuffer()))
// Nem kell csin饊ni semmit.
elseif (this:soreleje)
// Ez beolvassa az eg<65>z sort.
if (this:branch==.t.)
this:parseLine()
else
this:parseFalseLine()
endif
w:=this:getParserBuffer()
elseif (this:branch==.t.)
if (nil!=(w:=super:readInput()))
tkId:=TOKEN.w:id
tkStr:=TOKEN.w:str
if (tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS .or.;
(tkId==TKID_CHAR .and. tkStr==";"))
this:soreleje:=.t.
endif
endif
else
this:sorNyel()
w:=this:getParserBuffer()
this:soreleje:=.t.
endif
if (w!=nil .and. TOKEN.w:id==TKID_EOS)
this:lastEos:=w
endif
return w
//*******************************************************************
//*******************************************************************
implement parseLine()
// Csak akkor szabad h」ni, ha a parseBuffer <20>es <20> sor elej<65>
// vagyunk.
local state,tkId,tkStr
#ifdef ID_STRING
#define ST_L_START "start"
#define ST_L_HMARK "hessmark"
#else
#define ST_L_START 1
#define ST_L_HMARK 2
#endif
local ujsor,hmarkItem
local str
state:=ST_L_START
this:soreleje:=.f.
// this:errorItem:=nil
this:rds()
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
tkStr:=TOKEN.(this:item):str
ujsor:=tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS
if (state==ST_L_START)
if (ujsor .or.;
(tkId==TKID_CHAR .and. tkStr==";"))
// V<>e.
this:soreleje:=.t.
exit
elseif (tkId==TKID_URES)
// Maradunk
// state:=ST_L_START
elseif (tkId==TKID_CHAR .and. tkStr=="#")
// Kezd𡞫ik az elemz<6D>.
state:=ST_L_HMARK
hmarkItem:=this:item
else
// 䉀engedni az eg<65>zet.
this:soreleje:=.f.
// A readItem nem h」ja a parseline-t, ha nem sor
// elej<65> van.
exit
endif
elseif (state==ST_L_HMARK)
if (ujsor .or.;
(tkId==TKID_CHAR .and. tkStr==";"))
// Hib坟, <20> v<>e is van.
this:soreleje:=.t.
this:errorgen(hmarkItem,HPRERR_INVALIDMN)
exit
elseif (tkId==TKID_URES)
// Maradunk
// state:=ST_L_HMARK
elseif (tkId==TKID_NEV)
// Meg kell n<>ni, milyen n<>, <20> aszerint folytatni
// az elemz<6D>t.
tkStr:=lower(tkStr)
if (matchShortNames(tkStr,"define",4))
this:parseDefine(this:item)
elseif (matchShortNames(tkStr,"undef",4))
this:parseUndef(this:item)
elseif (matchShortNames(tkStr,"xtranslate",4) .or.;
matchShortNames(tkStr,"xcommand",4) .or.;
matchShortNames(tkStr,"translate",4) .or.;
matchShortNames(tkStr,"command",4))
this:parseTranslate(this:item)
elseif (matchShortNames(tkStr,"error",4))
hmarkitem:=this:item
this:rds()
str:=""
this:sorNyel({|x| str+=x})
this:errorGen(hmarkitem,HPRERR_USER,{str})
elseif (matchShortNames(tkStr,"stdout",4))
this:rds()
this:sorNyel({|x| outstd(x)})
outstd(newline())
elseif (matchShortNames(tkStr,"ifdef",4))
this:parseIfdef(this:item,IFDEFTYPE_IFDEF)
elseif (matchShortNames(tkStr,"ifndef",4))
this:parseIfdef(this:item,IFDEFTYPE_IFNDEF)
elseif (matchShortNames(tkStr,"else",4))
// Elm<6C>etileg ide csak akkor j悧et<65>k, ha az igaz
// 鮰r▍ <20>kezt<7A>k.
this:parseElse(this:item)
elseif (matchShortNames(tkStr,"endif",4))
// Elm<6C>etileg ide csak akkor j悧et<65>k, ha az igaz
// 鮰r▍ <20>kezt<7A>k.
this:parseEndif(this:item)
elseif (matchShortNames(tkStr,"include",4))
this:parseInclude(this:item)
else
this:errorgen(this:item,HPRERR_INVALIDMN,{tkStr})
this:sorNyel()
endif
this:soreleje:=.t.
exit
else
// Hib坟, a v<><76>g le kell nyelni.
this:soreleje:=.f.
this:errorgen(this:item,HPRERR_INVALIDMN,{tkStr})
exit
endif
else
? "HPARSER:parseLine(): Ismeretlen 饊lapot: ",state
errorlevel(1)
quit
endif
this:rds()
end while
return nil
//*******************************************************************
implement parseFalseLine()
// Olyan sor elemz<6D>e, ami egy #if hamis 鮰慙 van.
// Ilyenkor csak a #if, #endif-eket figyelj<6C>, egy<67>k<EFBFBD>t minden sort
// <20>esre reduk饊unk.
local state,tkId,tkStr
#ifdef ID_STRING
#define ST_FL_START "start"
#define ST_FL_HMARK "hessmark"
#else
#define ST_FL_START 1
#define ST_FL_HMARK 2
#endif
local ujsor,hmarkItem
state:=ST_FL_START
this:soreleje:=.f.
// this:errorItem:=nil
this:rds()
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
tkStr:=TOKEN.(this:item):str
ujsor:=tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS
if (state==ST_FL_START)
if (ujsor .or.;
(tkId==TKID_CHAR .and. tkStr==";"))
// V<>e.
this:soreleje:=.t.
exit
elseif (tkId==TKID_URES)
// Maradunk
// state:=ST_FL_START
elseif (tkId==TKID_CHAR .and. tkStr=="#")
// Kezd𡞫ik az elemz<6D>.
hmarkItem:=this:item
state:=ST_FL_HMARK
else
// 䉀engedni az eg<65>zet.
this:soreleje:=.f.
// A readItem nem h」ja a parseline-t, ha nem sor
// elej<65> van.
exit
endif
elseif (state==ST_FL_HMARK)
if (ujsor .or.;
(tkId==TKID_CHAR .and. tkStr==";"))
// Hib坟, <20> v<>e is van.
this:soreleje:=.t.
this:errorgen(hmarkItem,HPRERR_INVALIDMN)
exit
elseif (tkId==TKID_URES)
// Maradunk
state:=ST_FL_HMARK
elseif (tkId==TKID_NEV)
// Meg kell n<>ni, milyen n<>, <20> aszerint folytatni
// az elemz<6D>t.
tkStr:=lower(tkStr)
if (matchShortNames(tkStr,"ifdef",4))
this:parseIfdef(this:item,IFDEFTYPE_NONE)
elseif (tkStr=="ifndef")
this:parseIfdef(this:item,IFDEFTYPE_NONE)
elseif (matchShortNames(tkStr,"else",4))
if (this:branch!=nil)
this:parseElse(this:item)
// else
// Lenyeli.
endif
elseif (matchShortNames(tkStr,"endif",4))
this:parseEndif(this:item)
else
// A rossz neveket ilyenkor elfogadja.
endif
exit
else
// Hib坟, a v<><76>g le kell nyelni.
this:errorgen(this:item,HPRERR_INVALIDMN,{tkStr})
exit
endif
else
? "HPARSER:parseFalseLine(): Ismeretlen 饊lapot: ",state
errorlevel(1)
quit
endif
this:rds()
end while
this:sorNyel()
this:soreleje:=.t.
return nil
//*******************************************************************
implement errorgen(token,errorCode,params)
#ifdef OLD
local t
t:=TOKEN.token:copyToken(TKID_ERROR)
// TOKEN.t:error:={this:name,errorcode,;
// prsErrStr(errorcode)+if(empty(errStr),""," "+errStr)}
TOKEN.t:error:=errorcode
this:putParserBuffer(t)
this:errorItem:=t
#endif
// Egyenl𩂈e nem adunk 慯 param<61>ert.
aadd(this:errorStream,;
C.PRSERR:onewFromToken(errorCode,params,token))
return nil
//*******************************************************************
implement incompErrorgen(token,errorcode,params)
// this:errorgen(token,errorcode,params)
return .t.
//*******************************************************************
implement addXTranslate(mnameToken,leftSide,rightSide)
// Az mNameToken jelzi, hogy hol volt a defin︷i<EFB8B7>.
local w,cmdType,tkStr
tkStr:=lower(TOKEN.mnameToken:str)
if (matchShortNames(tkStr,"xtranslate",4))
cmdType:=XTRTYPE_XTRANSLATE
elseif (matchShortNames(tkStr,"xcommand",4))
cmdType:=XTRTYPE_XCOMMAND
elseif (matchShortNames(tkStr,"translate",4))
cmdType:=XTRTYPE_TRANSLATE
elseif (matchShortNames(tkStr,"command",4))
cmdType:=XTRTYPE_COMMAND
else
cmdType:=XTRTYPE_XTRANSLATE
endif
w:=C.EXTRDICT:onew(cmdType,leftSide,rightSide,;
TOKEN.mnameToken:file,;
TOKEN.mnameToken:line,;
TOKEN.mnameToken:pos)
// this:clearParserBuffer()
if (!empty(EXTRDICT.w:undefRMarkers))
aeval(EXTRDICT.w:undefRMarkers,;
{|x| this:errorgen(mnameToken,HPRERR_XTRUNDEFRM,;
{RMARKER.x:getName()})})
// outerr(EXTRDICT.w:printStr(),newline())
else
XTRDICT.(this:xtrdict):add(w)
endif
return nil
//*******************************************************************
implement sorNyel(kiirBlock)
// T㽣li a parserBuffer-t, majd a sor v<><76>g lenyeli az item-eket.
// A sorv<72>jelet a parserpuffer-ben hagyja.
// Ha az errorItem nem nil, akkor azt m<> a sorv<72>jel el<65> beteszi.
// Ha a kiirBlock egy block, akkor a token stringeket 慯adja neki.
local tkId
this:clearParserBuffer()
if (this:item==nil)
this:item:=this:readInput()
endif
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
if (tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or.;
tkId==TKID_EOS)
exit
endif
if (kiirBlock!=nil)
eval(kiirBlock,TOKEN.(this:item):getStr())
endif
this:item:=this:readInput()
end while
// if (this:errorItem!=nil)
// this:putParserBuffer(this:errorItem)
// endif
if (this:item!=nil)
this:putParserBuffer(this:item)
endif
return nil
//*******************************************************************
implement parseTranslate(mNameToken)
// A # xtranslate etc, elemz衠e.
/*
饊tal慙os szab饊yok:
- A bal oldalon egym坟ba lehet skatuly厪ni a '[]'-ket, a jobb
oldalon nem.
- Egyenl𩂈e :
- a jobb oldalon csak a regular match markert (<n<>>) <20> a list
match markert (<n<>,...>)-t fogadja el,
- a bal oldalon pedig csak a regular result markert (<n<>>)
fogadja el.
A bal oldal is <20> a jobb oldal is egy-egy token lista.
A markerek spec tokenek lesznek (le㽣琼l<E790BC>k a token oszt饊yb▍, ha
kell.)
Az alternalt」籑 a bal oldalon olyan tokenek, amik token list籑
list䰇慯 tartalmazz籑.
A '\' v<><76> karakter a k畕etkez<65> karaktereket v<>i:
'<','[','#','\'
Ha bekapcsoljuk az extend kapcsol┤ (ekkor a preprocesszorban
olyan funkci▎ is <20>etbe l<>nek, amik az eredeti preprocesszorban
nincsenek meg), akkor m<> v<>i a k畕etkez<65> karaktereket:
']'
Mj.: A ']' v<><76>e az<61>t sz<73>s<EFBFBD>es, mert a bal oldalon egym坟ba
lehet skatuly厪ni a '[]'-ket.
Mj2.: A '='-t nem kell v<>eni, a spec ugyanaz, ha v<>i a '\' vagy
ha nem.
Az eld䒟t<E4929F>re v<>, hogy egy nyit<69> '[' n<>k<EFBFBD>i ']'-t elfogadjunk-e
rendes karakternek.
*/
local leftSide,rightSide
if (nil!=(leftSide:=this:parseLTranslate(mNameToken)))
if (nil!=(rightSide:=this:parseRTranslate(mNameToken)))
this:addXTranslate(mNameToken,leftSide,rightSide)
endif
endif
return nil
//*******************************************************************
static function closeAlter(tokenList,malterStack)
local alter,itemMalterStack,t,w,i
// Lez<65>juk az elemzett alternet」慯.
// Kivessz<73> a malterstack-b𢡠 azt, amit le kell z<>ni.
alter:=tokenList
itemMalterStack:=atail(malterStack)
tokenList:=itemMalterStack[1]
// Most a tokenList-ben lev<65> tokenek azok, amik akkor
// voltak, amikor az alternat」慯 elkezdt<64> elemzni.
t:=nil
// Megkeress<73>, hogy alterset van-e a tokenlista v<><76>.
for i:=len(tokenList) to 1 step -1
w:=tokenList[i]
if (TOKEN.w:id==TKID_URES)
// 䉀ugorjuk
elseif (TOKEN.w:id==TKID_MALTERSET)
// A token lista v<><76> egy alterset van, ehhez
// hozz戹enni a mi alternat」慙ka is.
t:=w
// A v<><76>𢡠 az <20>eseket t㽣鎇j<E98E87>.
asize(tokenList,i)
exit
else
exit
endif
end for
if (t==nil)
// Ha nincs MALTRSET objektumunk, akkor csin饊unk,
// <20> a token lista v<><76>e tessz<73>.
t:=C.MALTRSET:copyFromToken(itemMalterStack[2],TKID_MALTERSET,nil)
aadd(tokenList,t)
endif
MALTRSET.t:addAlter(alter)
asize(malterStack,len(malterStack)-1)
return tokenList
//*******************************************************************
implement parseLTranslate(mnameToken)
// A # xtranslate bal oldal慙ak az elemz衠e.
// Ret: tokenList, ha indulhat a jobb oldal, nil, ha nem.
local state,tkId,tkStr
// Az malterStack ilyen elemekb𢡠 饊l: {savedTokenList,'[' token}
local malterStack:={}
local alter,itemMalterStack
local matchMarkerName
local restrictMlist:={},restrictItem:=nil
local t,w
local tokenList:={}
local eqList,ujsor
local bSlash
#ifdef ID_STRING
#define ST_TL_START "START"
#define ST_TL_MATCH_MARKER_START "MATCH_MARKER_START"
#define ST_TL_EQCHAR "EQCHAR"
#define ST_TL_MATCH_MARKER_NAME "MATCH_MARKER_NAME"
#define ST_TL_WILD_MATCH_MARKER_START "WILD_MATCH_MARKER_START"
#define ST_TL_WILD_MATCH_MARKER_NAME "WILD_MATCH_MARKER_NAME"
#define ST_TL_WILD_MATCH_MARKER_NAMESTAR "WILD_MATCH_MARKER_NAMESTAR"
#define ST_TL_EXT_EXPR_MATCH_MARKER_START "EXT_EXPR_MATCH_MARKER_START"
#define ST_TL_EXT_EXPR_MATCH_MARKER_NAME "EXT_EXPR_MATCH_MARKER_NAME"
#define ST_TL_EXT_EXPR_MATCH_MARKER_NAMEPARENT "EXT_EXPR_MATCH_MARKER_PARENT"
#define ST_TL_LIST_MATCH_MARKER_DOTS "LIST_MATCH_MARKER_DOTS"
#define ST_TL_LIST_MATCH_MARKER_DOTS1 "LIST_MATCH_MARKER_DOTS1"
#define ST_TL_LIST_MATCH_MARKER_DOTS2 "LIST_MATCH_MARKER_DOTS2"
#define ST_TL_LIST_MATCH_MARKER_DOTS3 "LIST_MATCH_MARKER_DOTS3"
#define ST_TL_RESTRICTED_MATCH_MARKER_WORDLIST "RESTRICTED_MATCH_MARKER_WORDLIST"
#else
#define ST_TL_START 1
#define ST_TL_MATCH_MARKER_START 2
#define ST_TL_EQCHAR 3
#define ST_TL_MATCH_MARKER_NAME 4
#define ST_TL_WILD_MATCH_MARKER_START 5
#define ST_TL_WILD_MATCH_MARKER_NAME 6
#define ST_TL_WILD_MATCH_MARKER_NAMESTAR 7
#define ST_TL_EXT_EXPR_MATCH_MARKER_START 8
#define ST_TL_EXT_EXPR_MATCH_MARKER_NAME 9
#define ST_TL_EXT_EXPR_MATCH_MARKER_NAMEPARENT 10
#define ST_TL_LIST_MATCH_MARKER_DOTS 11
#define ST_TL_LIST_MATCH_MARKER_DOTS1 12
#define ST_TL_LIST_MATCH_MARKER_DOTS2 13
#define ST_TL_LIST_MATCH_MARKER_DOTS3 14
#define ST_TL_RESTRICTED_MATCH_MARKER_WORDLIST 15
#endif
state:=ST_TL_START
this:rds()
bSlash:=.f.
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
tkStr:=TOKEN.(this:item):str
ujsor:=tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS
if (state==ST_TL_START)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Maradunk.
aadd(tokenList,this:item)
elseif (tkId==TKID_CHAR .and. tkStr=="[")
// Ez egy indul<75> alternat」a a bal oldalon. Ha a token
// list<73>an az utols<6C> token egy MALTRSET (match
// alternative token), akkor az ο alternat」慯 majd
// hozz<7A> csatoljuk.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
aadd(malterStack,{tokenList,this:item})
tokenList:={}
endif
elseif (tkId==TKID_CHAR .and. tkStr=="]")
// Az aktu饊is token sor egy alternat」a lesz.
if (len(malterStack)<=0)
// Hiba: van lez<65><7A> ']', μy, hogy nincs nyit<69> '['.
// Ezt a spec elfogadja, mi is elfogadjuk.
aadd(tokenList,this:item)
bSlash:=.f.
else
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
// Tov<6F>b megy<67>k!
endif
// Lez<65>juk az elemzett alternet」慯.
tokenList:=closeAlter(tokenList,malterStack)
#ifdef OLD
// Kivessz<73> a malterstack-b𢡠 azt, amit le kell z<>ni.
alter:=tokenList
itemMalterStack:=atail(malterStack)
tokenList:=itemMalterStack[1]
// Most a tokenList-ben lev<65> tokenek azok, amik akkor
// voltak, amikor az alternat」慯 elkezdt<64> elemzni.
if (len(tokenList)<=0)
// Nincs token ==> Nincs alterset sem a v<><76>.
t:=nil
else
w:=atail(tokenList)
if (TOKEN.w:id==TKID_MALTERSET)
// A token lista v<><76> egy alterset van, ehhez
// hozz戹enni a mi alternat」慙ka is.
t:=w
else
// A token lista v<><76> nem alterset van.
t:=nil
endif
endif
if (t==nil)
// Ha nincs MALTRSET objektumunk, akkor csin饊unk,
// <20> a token lista v<><76>e tessz<73>.
t:=C.MALTRSET:copyFromToken(itemMalterStack[2],TKID_MALTERSET,nil)
aadd(tokenList,t)
endif
MALTRSET.t:addAlter(alter)
asize(malterStack,len(malterStack)-1)
#endif
endif
elseif (tkId==TKID_CHAR .and. tkStr=="<")
// Ez egy marker.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
state:=ST_TL_MATCH_MARKER_START
endif
elseif (tkId==TKID_CHAR .and. tkStr=="=")
// Ez vagy egy '=' jel vagy egy '=>'-nek az els<6C> r<>ze.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
// Tov<6F>b megy<67>k!
endif
state:=ST_TL_EQCHAR
eqList:={this:item}
elseif (tkId==TKID_CHAR .and. tkStr=="\")
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
bSlash:=.t.
endif
// Maradunk.
else
// Ez aktu饊isan elemzett list<73>a ker<65>.
bSlash:=.f.
aadd(tokenList,this:item)
endif
elseif (state==ST_TL_MATCH_MARKER_START)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_NEV)
// A match marker neve.
matchMarkerName:=this:item
state:=ST_TL_MATCH_MARKER_NAME
elseif (tkId==TKID_CHAR .and. tkStr=="*")
// Ez egy wild match marker lesz.
state:=ST_TL_WILD_MATCH_MARKER_START
elseif (tkId==TKID_CHAR .and. tkStr=="(")
// Ez egy extended expression match marker lesz.
state:=ST_TL_EXT_EXPR_MATCH_MARKER_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_MATCH_MARKER_NAME)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==",")
// List match marker
state:=ST_TL_LIST_MATCH_MARKER_DOTS
elseif (tkId==TKID_CHAR .and. tkStr==":")
// Restricted match marker
state:=ST_TL_RESTRICTED_MATCH_MARKER_WORDLIST
restrictMList:={}
restrictItem:=nil
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Ez egy regular match marker volt. Elk<6C>z﹀j<EFB980> a tokent.
aadd(tokenList,;
C.MMARKER:copyFromToken(matchMarkerName,;
TKID_REGULAR_MATCH_MARKER,;
nil))
state:=ST_TL_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_WILD_MATCH_MARKER_START)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_NEV)
// A match marker neve.
matchMarkerName:=this:item
state:=ST_TL_WILD_MATCH_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_WILD_MATCH_MARKER_NAME)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr=="*")
state:=ST_TL_WILD_MATCH_MARKER_NAMESTAR
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_WILD_MATCH_MARKER_NAMESTAR)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Ez egy wild match marker volt. Elk<6C>z﹀j<EFB980> a tokent.
aadd(tokenList,;
C.MMARKER:copyFromToken(matchMarkerName,;
TKID_WILD_MATCH_MARKER,;
nil))
state:=ST_TL_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_EXT_EXPR_MATCH_MARKER_START)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_NEV)
// A match marker neve.
matchMarkerName:=this:item
state:=ST_TL_EXT_EXPR_MATCH_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_EXT_EXPR_MATCH_MARKER_NAME)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==")")
state:=ST_TL_EXT_EXPR_MATCH_MARKER_NAMEPARENT
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_EXT_EXPR_MATCH_MARKER_NAMEPARENT)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Ez egy extended expression match marker volt. Elk<6C>z﹀j<EFB980> a tokent.
aadd(tokenList,;
C.MMARKER:copyFromToken(matchMarkerName,;
TKID_EXT_EXPR_MATCH_MARKER,;
nil))
state:=ST_TL_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_LIST_MATCH_MARKER_DOTS)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==".")
state:=ST_TL_LIST_MATCH_MARKER_DOTS1
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_LIST_MATCH_MARKER_DOTS1)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==".")
state:=ST_TL_LIST_MATCH_MARKER_DOTS2
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_LIST_MATCH_MARKER_DOTS2)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==".")
state:=ST_TL_LIST_MATCH_MARKER_DOTS3
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_LIST_MATCH_MARKER_DOTS3)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Ez egy List match marker marker volt. Elk<6C>z﹀j<EFB980> a tokent.
aadd(tokenList,;
C.MMARKER:copyFromToken(matchMarkerName,;
TKID_LIST_MATCH_MARKER,;
nil))
state:=ST_TL_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_RESTRICTED_MATCH_MARKER_WORDLIST)
// Ez nem j<>, mert itt nem csak szavak, hanem b<>milyen
// token lista lehet. Egyenl𩂈e az egy elem<65> token
// list籑at engedj<64> meg, de ezt nem ellen𩂈izz<7A>.
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
// Maradunk.
elseif (tkId==TKID_CHAR .and. tkStr==",")
// A listaelemek kihagy坟慯 a spec megengedi.
if (restrictItem==nil)
restrictItem:=""
endif
aadd(restrictMList,restrictItem)
restrictItem:=""
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Ez egy Restricted match marker volt. Elk<6C>z﹀j<EFB980> a tokent.
if (restrictItem!=nil)
aadd(restrictMList,restrictItem)
endif
t:=C.RSMMARKR:copyFromToken(matchMarkerName,TKID_RESTRICTED_MATCH_MARKER,nil)
RSMMARKR.t:wordList:=restrictMList
aadd(tokenList,t)
restrictMList:={}
restrictItem:=nil
state:=ST_TL_START
elseif (tkId==TKID_NEV)
restrictItem:=tkStr
// Maradunk, mert a listaelemek kihagy坟慯 a spec
// megengedi.
elseif (tkId==TKID_STRING .or. tkId==TKID_SZAMTOMB .or. tkId==TKID_CHAR)
restrictItem:=tkStr
// Maradunk, mert a listaelemek kihagy坟慯 a spec
// megengedi.
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TL_EQCHAR)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
aadd(eqList,this:item)
elseif (tkId==TKID_CHAR .and. tkStr == '\')
bSlash:=.t.
elseif (tkId==TKID_CHAR .and. tkStr == '>')
// Ez a hat<61>ol<6F>, v饊tunk.
// A bal oldalt eltessz<73>, <20> j䒟 a jobb oldal.
if (bSlash)
aeval(eqList,{|x| aadd(tokenList,x)})
eqList:={}
aadd(tokenList,this:item)
bSlash:=.f.
state:=ST_TL_START
else
// Itt meg kell n<>ni nem vagyunk-e egy
// alternat」<74>an.
if (len(malterStack)>0)
this:errorgen(this:item,HPRERR_XTRLUNCLOSED)
while(!empty(malterStack))
tokenList:=closeAlter(tokenList,malterStack)
end while
endif
return tokenList
endif
elseif (tkId==TKID_CHAR .and. tkStr=='=')
// Ezt a spec hib慙ak tekinti, de val▏<6C>an nem az.
// Azt mondja r<>, hogy hi慙yz<79> '=>'
if (bSlash)
aeval(eqList,{|x| aadd(tokenList,x)})
eqList:={}
aadd(tokenList,this:item)
bSlash:=.f.
state:=ST_TL_START
else
if (this:incompErrorgen(this:item,HPRERR_SXTRANSLATE))
exit
endif
// Ez m<> megy a bal oldalhoz.
aeval(eqList,{|x| aadd(tokenList,x)})
eqList:={this:item}
endif
else
// B<>mi m坟, vissza az eg<65>z.
aeval(eqList,{|x| aadd(tokenList,x)})
eqList:={}
this:unrds()
state:=ST_TL_START
endif
else
? "HPARSER:parseLTranslate(): Ismeretlen 饊lapot: ",state
errorlevel(1)
quit
endif
this:rds()
end while
this:sorNyel()
return nil
//*******************************************************************
implement parseRTranslate(mnameToken)
// A # xtranslate jobb oldal慙ak az elemz衠e.
local state,tkId,tkStr,ujsor
#ifdef ID_STRING
#define ST_TR_START "START"
#define ST_TR_RESULT_MARKER_START "RESULT_MARKER_START"
#define ST_TR_DUMB_STR_RESULT_MARKER_START "DUMB_STR_RESULT_MARKER_START"
#define ST_TR_DUMB_STR_RESULT_MARKER_STARTNAME "DUMB_STR_RESULT_MARKER_STARTNAME"
#define ST_TR_DUMB_STR_RESULT_MARKER_NAME "DUMB_STR_RESULT_MARKER_NAME"
#define ST_TR_REGULAR_RESULT_MARKER_NAME "REGULAR_RESULT_MARKER_NAME"
#define ST_TR_STRINGIFY_RESULT_MARKER_NAME "STRINGIFY_RESULT_MARKER_NAME"
#define ST_TR_SMART_STR_RESULT_MARKER_START "SMART_STR_RESULT_MARKER_START"
#define ST_TR_SMART_STR_RESULT_MARKER_NAMEPAR "SMART_STR_RESULT_MARKER_NAMEPAR"
#define ST_TR_SMART_STR_RESULT_MARKER_NAME "SMART_STR_RESULT_MARKER_NAME"
#define ST_TR_BLOCKIFY_RESULT_MARKER_START "BLOCKIFY_RESULT_MARKER_START"
#define ST_TR_BLOCKIFY_RESULT_MARKER_NAME "BLOCKIFY_RESULT_MARKER_NAME"
#define ST_TR_BLOCKIFY_RESULT_MARKER_NAMEPAR "BLOCKIFY_RESULT_MARKER_NAMEPAR"
#define ST_TR_LOGIFY_RESULT_MARKER_START "LOGIFY_RESULT_MARKER_START"
#define ST_TR_LOGIFY_RESULT_MARKER_NAME "LOGIFY_RESULT_MARKER_NAME"
#define ST_TR_LOGIFY_RESULT_MARKER_NAMEPAR "LOGIFY_RESULT_MARKER_NAMEPAR"
#else
#define ST_TR_START 1
#define ST_TR_RESULT_MARKER_START 2
#define ST_TR_DUMB_STR_RESULT_MARKER_START 3
#define ST_TR_DUMB_STR_RESULT_MARKER_STARTNAME 4
#define ST_TR_DUMB_STR_RESULT_MARKER_NAME 5
#define ST_TR_REGULAR_RESULT_MARKER_NAME 6
#define ST_TR_STRINGIFY_RESULT_MARKER_NAME 7
#define ST_TR_SMART_STR_RESULT_MARKER_START 8
#define ST_TR_SMART_STR_RESULT_MARKER_NAMEPAR 9
#define ST_TR_SMART_STR_RESULT_MARKER_NAME 10
#define ST_TR_BLOCKIFY_RESULT_MARKER_START 11
#define ST_TR_BLOCKIFY_RESULT_MARKER_NAME 12
#define ST_TR_BLOCKIFY_RESULT_MARKER_NAMEPAR 13
#define ST_TR_LOGIFY_RESULT_MARKER_START 14
#define ST_TR_LOGIFY_RESULT_MARKER_NAME 15
#define ST_TR_LOGIFY_RESULT_MARKER_NAMEPAR 16
#endif
local tokenList:={}
local saveTokenList:=nil // Ide mentj<74> el a tokenList-et, amikor
// alternat」慯 elemz<6D>k.
local t
local dumbList // dumb stringify result markerek elemz<6D><7A><EFBFBD> '#' <20>
// az ut慙a k畕etkez<65> token lista a '<'-ig.
local resultMarkerName
local w
local bSlash
// Drop spaces
this:rds()
while(this:item!=nil .and. TOKEN.(this:item):id==TKID_URES)
this:rds()
end while
state:=ST_TR_START
bSlash:=.f.
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
tkStr:=TOKEN.(this:item):str
ujsor:=tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS
if (state==ST_TR_START)
if (ujsor)
// V<>e van.
this:sorNyel()
return tokenlist
elseif (tkId==TKID_URES)
// Maradunk
if (!bSlash)
aadd(tokenList,this:item)
endif
elseif (tkId==TKID_CHAR .and. tkStr=="[")
// Ez egy indul<75> alternat」a a jobb oldalon.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
elseif (saveTokenList!=nil)
// Hiba: Egym坟ba skatuly厪ott []
this:errorgen(this:item,HPRERR_XTRRNESTED)
else
saveTokenList:=tokenList
tokenList:={}
endif
elseif (tkId==TKID_CHAR .and. tkStr=="]")
// Az aktu饊is token sor egy alternat」a lesz.
if (saveTokenList==nil)
// Hiba: van lez<65><7A> ']', μy, hogy nincs nyit<69> '['.
// Ezt a spec elfogadja, mi is elfogadjuk.
aadd(tokenList,this:item)
bSlash:=.f.
else
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
endif
if (!empty(tokenList))
t:=C.RALTER:copyFromToken(tokenList[1],TKID_RALTER,nil)
RALTER.t:tokenList:=tokenList
aadd(saveTokenList,t)
endif
tokenList:=saveTokenList
saveTokenList:=nil
endif
elseif (tkId==TKID_CHAR .and. tkStr=="<")
// Ez egy marker.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
state:=ST_TR_RESULT_MARKER_START
endif
elseif (tkId==TKID_CHAR .and. tkStr=="#")
// Ez lehet egy dumb stringify result marker.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
state:=ST_TR_DUMB_STR_RESULT_MARKER_START
dumbList:={this:item}
endif
elseif (tkId==TKID_CHAR .and. tkStr=="\")
// Ez v<><76> karakter, de csak a cthis:shelterChar-ban
// szerepl恾et v<>i, egy<67>k<EFBFBD>t marad norm饊 karakter.
// Mj.: Ezt ki kell pr▁饊ni.
// Egyenl𩂈e nem dolgozzuk fel.
if (bSlash)
aadd(tokenList,this:item)
bSlash:=.f.
else
bSlash:=.t.
endif
// Maradunk.
else
// Ez aktu饊isan elemzett list<73>a ker<65>.
aadd(tokenList,this:item)
bSlash:=.f.
endif
elseif (state==ST_TR_DUMB_STR_RESULT_MARKER_START)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
aadd(dumbList,this:item)
elseif (tkId==TKID_CHAR .and. tkStr=="<")
// Ez dumb stringify result marker.
state:=ST_TR_DUMB_STR_RESULT_MARKER_STARTNAME
else
// K瑨䒟s<E4929F>es karakter. Vissza az eg<65>z.
aeval(dumbList,{|x| aadd(tokenList,x)})
this:unrds()
state:=ST_TR_START
endif
elseif (state==ST_TR_DUMB_STR_RESULT_MARKER_STARTNAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_NEV)
// A result marker neve.
resultMarkerName:=this:item
state:=ST_TR_DUMB_STR_RESULT_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_DUMB_STR_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_DUMB_STR_RESULT_MARKER,;
nil))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_RESULT_MARKER_START)
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_XTRANSLATEEOL)
exit
elseif (tkId==TKID_URES)
// Eldobjuk.
elseif (tkId==TKID_NEV)
// A result marker neve.
resultMarkerName:=this:item
state:=ST_TR_REGULAR_RESULT_MARKER_NAME
elseif (tkId==TKID_STRING)
// A result marker neve, ez egy Normal stringify result
// marker
resultMarkerName:=this:item
state:=ST_TR_STRINGIFY_RESULT_MARKER_NAME
elseif (tkId==TKID_CHAR .and. tkStr=="(")
// Ez egy Smart stringify result marker lesz.
state:=ST_TR_SMART_STR_RESULT_MARKER_START
elseif (tkId==TKID_CHAR .and. tkStr=="{")
// Ez egy Blockify result marker lesz.
state:=ST_TR_BLOCKIFY_RESULT_MARKER_START
elseif (tkId==TKID_CHAR .and. tkStr==".")
// Ez egy Logify result marker lesz.
state:=ST_TR_LOGIFY_RESULT_MARKER_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_REGULAR_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_REGULAR_RESULT_MARKER,;
nil))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_STRINGIFY_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
w:=TOKEN.resultMarkerName:str
// w:=substr(w,2,len(w)-2)
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_STRINGIFY_RESULT_MARKER,;
w))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_SMART_STR_RESULT_MARKER_START)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_NEV)
resultMarkerName:=this:item
state:=ST_TR_SMART_STR_RESULT_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_SMART_STR_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==")")
state:=ST_TR_SMART_STR_RESULT_MARKER_NAMEPAR
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_SMART_STR_RESULT_MARKER_NAMEPAR)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_SMART_STR_RESULT_MARKER,;
nil))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_BLOCKIFY_RESULT_MARKER_START)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_NEV)
resultMarkerName:=this:item
state:=ST_TR_BLOCKIFY_RESULT_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_BLOCKIFY_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr=="}")
state:=ST_TR_BLOCKIFY_RESULT_MARKER_NAMEPAR
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_BLOCKIFY_RESULT_MARKER_NAMEPAR)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_BLOCKIFY_RESULT_MARKER,;
nil))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_LOGIFY_RESULT_MARKER_START)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_NEV)
resultMarkerName:=this:item
state:=ST_TR_LOGIFY_RESULT_MARKER_NAME
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_LOGIFY_RESULT_MARKER_NAME)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==".")
state:=ST_TR_LOGIFY_RESULT_MARKER_NAMEPAR
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
elseif (state==ST_TR_LOGIFY_RESULT_MARKER_NAMEPAR)
if (ujsor)
// V<>e van.
exit
elseif (tkId==TKID_URES)
// Maradunk
elseif (tkId==TKID_CHAR .and. tkStr==">")
// Itt a v<>e.
aadd(tokenList,;
C.RMARKER:copyFromToken(resultMarkerName,;
TKID_LOGIFY_RESULT_MARKER,;
nil))
resultMarkerName:=nil
state:=ST_TR_START
else
// B<>mi m坟 => rossz.
this:errorgen(this:item,HPRERR_SXTRANSLATE)
exit
endif
else
? "HPARSER:parseRTranslate(): Ismeretlen 饊lapot: ",state
errorlevel(1)
quit
endif
this:rds()
end while
this:sorNyel()
return nil
//*******************************************************************
implement chkEndOfFile()
local file, line,pos,i
// A spec erre nem mond hib慯 (!)
// return nil // Incompatibility.
if (len(this:ifStack)<=0)
// Minden rendben.
return nil
endif
if (this:lastEos!=nil)
file:=TOKEN.(this:lastEos):file
line:=TOKEN.(this:lastEos):line
pos :=TOKEN.(this:lastEos):pos
else
file:=this:name
line:=0
pos :=0
endif
for i:=1 to len(this:ifStack)
// Sajnos a poz︷i┤ egyenl𩂈e nem t<>oljuk.
// Az<41>t nem errorgen, mert itt nincs mindig token.
this:addError(C.PRSERR:onew(HPRERR_ENDIFMISSING,nil,; // Nincs token.
file,line,pos))
end for
return nil
//*******************************************************************
implement parseInclude(mnameToken)
// A #include elemz衠e.
// A fil<69>pec ut慙 mindent lenyel a sor v<><76>g.
local tkId,tkStr
local item,name
local ujsor
local w,wErrCode
this:rds()
while(this:item!=nil)
tkId:=TOKEN.(this:item):id
tkStr:=TOKEN.(this:item):str
ujsor:=tkId==TKID_UJSOR .or.;
tkId==TKID_BOS .or. tkId==TKID_EOS
if (ujsor)
// Hib坟 <20> v<>e is van.
this:errorgen(mnameToken,HPRERR_INCLUDE)
exit
elseif (tkId==TKID_URES)
// Maradunk.
elseif (tkId==TKID_STRING)
// Ez a neve
item:=this:item
this:sorNyel()
// name:=substr(tkStr,2,len(tkStr)-2)
name:=tkStr
if (0!=(w:=INCL.(this:inclObj):openIncludeFile(name)))
if (w==1)
wErrCode:=HPRERR_INCLUDEOPEN
elseif (w==2)
wErrCode:=HPRERR_INCLUDEFIND
else
wErrCode:=HPRERR_INCLUDENEST
endif
this:errorGen(item,wErrCode,{name})
endif
return nil
else
// Hib坟.
this:errorgen(this:item,HPRERR_INCLUDE)
exit
endif
this:rds()
end while
this:sorNyel()
return nil
//*******************************************************************