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

245 lines
7.3 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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$
*/
//*******************************************************************
// xtrdict.prg: #xtranslate sz¢t r
// 1999, Csisz r Levente
//*******************************************************************
#include "ctoken.ch"
#include "objgen.ch"
//*******************************************************************
#include "token.och"
#include "extrdict.och"
#include "mmarker.och"
//*******************************************************************
#define _XTRDICT_PRG_
// #define _IMPLEMENT_ONEW_
#include "xtrdict.och"
//*******************************************************************
implement oinit()
super:oinit()
this:cmdict:={}
this:trdict:={}
this:cmdictTree:={}
this:trdictTree:={}
return nil
//*******************************************************************
implement add(extrdict)
if (EXTRDICT.extrdict:cmdType==XTRTYPE_XCOMMAND .or.;
EXTRDICT.extrdict:cmdType==XTRTYPE_COMMAND)
aadd(this:cmdict,extrdict)
addToTree(this:cmdictTree,extrdict)
else
aadd(this:trdict,extrdict)
addToTree(this:trdictTree,extrdict)
endif
return nil
//*******************************************************************
implement printStr(printBlock,xcmd)
local i,w
local str:=""
if (!empty(xcmd))
for i:=1 to len(this:cmdict)
w:=toStr(i)+": "+EXTRDICT.(this:cmdict[i]):printStr()
if (printBlock!=nil)
eval(printBlock,w)
else
str+=w+newline()
endif
end for
else
for i:=1 to len(this:trdict)
w:=toStr(i)+": "+EXTRDICT.(this:trdict[i]):printStr()
if (printBlock!=nil)
eval(printBlock,w)
else
str+=w+newline()
endif
end for
endif
return str
//*******************************************************************
implement getExtrList(item,xcmd)
// Egyenl“re az ”sszes extrdict-et adja, ks“bb majd gyors¡tunk.
if (!empty(xcmd))
return this:cmdict
endif
return this:trdict
//*******************************************************************
//*******************************************************************
//
// Fa p¡ts
//
//*******************************************************************
//*******************************************************************
static function eqNextToken(t1,t2)
// Kider¡ti, hogy a t1, t2 tokenek azonosak-e, ha next tokenek.
local tk1Id
if (t1==nil)
return t2==nil
elseif (t2==nil)
return .f.
endif
tk1Id:=TOKEN.t1:id
if (tk1Id==TKID_NEV .or.;
tk1Id==TKID_SZAMTOMB .or.;
tk1Id==TKID_STRING .or.;
tk1Id==TKID_CHAR)
return tk1Id==TOKEN.t2:id .and.;
lower(TOKEN.t1:str)==lower(TOKEN.t2:str) .and.;
TOKEN.t1:eqType==TOKEN.t2:eqType
endif
return .f.
//*******************************************************************
static function addToTree(treeNodeList,extrDict)
// Az extrdict bal oldal lt hozz veszi a f hoz.
// Az (£j) lez r¢ elembe be¡rja az extrDict-et. (Mj.: Ez nem
// felttlen<65>l levl)
/*
tree:=nodeList
node:={token,nodeList[,extrDict]}
nodeList:={node1,...}
Mj.: Ha egy node-ba betesz<73>nk egy extrDict-et, akkor a nodeList-et
t”r”lni kell, mert soha nem fog rvnyre jutni (s hib t is
okoz, ha itt megpr¢b lunk tov bb menni).
Ha mgis meg akarjuk tartani, akkor a rgi nodeList-et
 t kell tenni m shova.
Egyenl“re az alternat¡v kat mindig egyben kezelj<6C>k, s
kt alternat¡va soha sem azonos, s 'v laszt¢ vonalknt'
viselkednek, vagyis, a kt oldalukra es“ tokenek soha sem
teintend“k azonosnak.
Mj.: Jobb lenne az alternat¡v kat  ganknt bele illeszteni a
f ba, £gy, hogy az <20>res  gat is beleillesztj<74>k, de ekkor
az ismtl“dseket csak akkor tudjuk felvenni ha a f b¢l
gr fot csin lunk (lesz benne k”r).
Mj.: Kt alternat¡v t azonosnak tekinthetnnk, ha minden  gukon
minden tokenlista ugyanaz. De ekkor is v laszt¢ vonalknt
kell, hogy viselkedjenek.
A ks“bb hozz adott node-ok vannak el“rbb a nodeList-ekben.
*/
local tokenList, lastNode,i,j
local megvan
local t,tkId,tkStr,tkEqType
local tn,tkNextTk
tokenList:=EXTRDICT.extrDict:leftSide
lastNode:=nil
for i:=1 to len(tokenList)
t:=tokenList[i]
tkId:=TOKEN.t:id
tkStr:=TOKEN.t:str
tkEqType:=TOKEN.t:eqType
if (tkId==TKID_MALTERSET)
lastNode:={t,{}}
aunget(treeNodeList,lastNode)
treeNodeList:=treeNodelist[1][2]
elseif (tkId==TKID_NEV .or.;
tkId==TKID_SZAMTOMB .or.;
tkId==TKID_STRING .or.;
tkId==TKID_CHAR)
// Az els“ malterset-ig keres<65>nk egy olyan tokent, ami
// azonos vele.
/*
Mj.: Az eqType hi ba EQTYPE_4LEN, akkor sem lehet 4-re
csonk¡tva vizsg lni.
*/
// Egyenl“re mindegyik case insensitive.
megvan:=.f.
for j:=1 to len(treeNodeList)
tn:=treeNodeList[j][1]
if (TOKEN.tn:id==TKID_MALTERSET)
// Meg llunk, £j  g lefel.
exit
elseif (TOKEN.tn:id==tkId .and.;
lower(TOKEN.tn:str)==lower(tkStr) .and.;
TOKEN.tn:eqType==tkEqType)
// Megvan! Megy<67>nk lefel a f n.
megvan:=.t.
lastNode:=treeNodelist[j]
treeNodeList:=treeNodelist[j][2]
exit
endif
end for
if (!megvan)
// Nem tal lt semmit, £j  g lefel.
lastNode:={t,{}}
aunget(treeNodeList,lastNode)
treeNodelist:=treeNodelist[1][2]
endif
elseif (C.MMARKER:isMatchMarker(t))
// Match markerek.
// Itt a t¡pusnak az index-nek s a nextToken-ek kell egyeznie.
// Mj.: Az, hogy a nextTokennek milyen match markereknl
// kell egyeznie, nincs kitesztelve!
//
tkNextTk:=MMARKER.t:nextToken
megvan:=.f.
for j:=1 to len(treeNodeList)
tn:=treeNodeList[j][1]
if (TOKEN.tn:id==TKID_MALTERSET)
// Meg llunk, £j  g lefel.
exit
elseif (TOKEN.tn:id==tkId .and.;
;//MMARKER.tn:getName()==MMARKER.t:getName() .and.;
MMARKER.tn:mNum==MMARKER.t:mNum .and.;
eqNextToken(tkNextTk,MMARKER.tn:nextToken))
// Megvan!
megvan:=.t.
lastNode:=treeNodelist[j]
treeNodeList:=treeNodelist[j][2]
exit
endif
end for
if (!megvan)
// Nem tal lt semmit, £j  g lefel.
lastNode:={t,{}}
aunget(treeNodeList,lastNode)
treeNodeList:=treeNodelist[1][2]
endif
else
// Minden m st kihagyunk. Ebben benne van az <20>res is.
endif
end for
// Vge.
// Ilyenkor az utols¢ node-ban t”r”lni kell a nodeList-et, s
// az extrdict-et, ha van, s betenni egy <20>res nodeList-et,
// s a mi extrDict-<2D>nket.
if (lastNode!=nil)
asize(lastNode,3)
asize(lastNode[2],0)
lastNode[3]:=extrDict
// else
// Az extrDict <20>res volt. Az <20>resek defin¡ci¢ szerint semmire
// sem illeszkednek.
endif
return nil
//*******************************************************************