📄 parse.c
字号:
#include <stdio.h>#include "defines.h"#include "types.h"#include "keywords.h"/*** IMPORTED *****/extern PARSETREE *token;extern char *keywords[];/*extern int inputmask;*/extern void add_token();static int inputmask = (-1 & ~COMMENT & ~GRAPHIC);/******** flags for context sensitive rules *********/static int Fvref, Fassign; /* to change 'IDENT' into 'VALUEREF' */static int Fext, Fpage, Ftech, Fcont, Fintf;/********** defines for parser **********/#define RULE static#define IS () {int b = TRUE;#define ZERO(n) int n = FALSE;#define FORM(keydef) if(token->type!=keydef) return(FALSE);\ else add_token()#define CONDFORM(k,msk) if(token->type!=k) return(FALSE);\ if(inputmask&msk) return(match_anyitem(TRUE));\ else add_token()#define ONCE ; b =#define REPEAT ; while (b && token->type != ENDLIST) b =#define OPTIONAL ; if (b && token->type != ENDLIST) b |=#define G1(guard,f) (!guard&&(guard=f()))#define MATCH(keydef) ((token->data.token==keywords[keydef])?\ (add_token(), TRUE): FALSE)#define ENDFORM ; return( match_endlist( b));}#define END ; return( b);}#define ANYTAIL ; return( match_tail(b));}#define FLAG(f) ; f=TRUE#define UNFLAG(f) ; f=FALSE/*********************************************************************//* Functions for each EDIF grammar rule *//*********************************************************************/RULE Pabs IS FORM(Kabs) ONCE PnumberValue() ENDFORMRULE PacLoad IS FORM(KacLoad) ONCE PmiNoMaxValue() || PmiNoMaxDisplay() ENDFORMRULE Pactual IS FORM(Kactual) ONCE PformalNameRef() ENDFORMRULE Pafter IS FORM(Kafter) ONCE PmiNoMaxValue() REPEAT PlogicAssign() || Pfollow() || Pmaintain() || Pcomment() || PuserData() ENDFORMRULE Pand IS FORM(Kand) REPEAT PbooleanValue() ENDFORMRULE Pannotate IS FORM(Kannotate) ONCE PstringValue() || PstringDisplay() ENDFORMRULE Papply IS FORM(Kapply) ONCE Pcycle() REPEAT PlogicInput() || PlogicOutput() || Pcomment() || PuserData() ENDFORMRULE Parc IS FORM(Karc) ONCE PpointValue() && PpointValue() && PpointValue() ENDFORMRULE Passign IS FORM(Kassign) FLAG(Fassign) ONCE PvalueNameRef() && PtypedValue() UNFLAG(Fassign) ENDFORMRULE Parray IS FORM(Karray) ONCE PnameDef() && PintegerValue() REPEAT PintegerValue() ENDFORMRULE ParrayMacro IS FORM(KarrayMacro) ONCE Pplug() ENDFORMRULE ParrayRelatedInfo IS FORM(KarrayRelatedInfo) ONCE ParrayMacro() || ParraySite() || PbaseArray() REPEAT Pcomment() || PuserData() ENDFORMRULE ParraySite IS FORM(KarraySite) ONCE Psocket() ENDFORMRULE PatLeast IS FORM(KatLeast) ONCE PnumberValue() ENDFORMRULE PatMost IS FORM(KatMost) ONCE PnumberValue() ENDFORMRULE Pauthor IS FORM(Kauthor) ONCE PstringToken() ENDFORMRULE PbaseArray IS FORM(KbaseArray) ENDFORMRULE Pbecomes IS FORM(Kbecomes) ONCE PlogicNameRef() || PlogicList()|| PlogicOneOf() ENDFORMRULE Pbetween IS FORM(Kbetween) ONCE (PatLeast() || PgreaterThan()) && (PatMost() || PlessThan()) ENDFORMRULE Pblock IS FORM(Kblock) REPEAT Pstatement() ENDFORMRULE Pboolean IS FORM(Kboolean) REPEAT PbooleanValue() || PbooleanDisplay() || Pboolean() ENDFORMRULE PbooleanDisplay IS FORM(KbooleanDisplay) ONCE PbooleanValue() REPEAT Pdisplay() ENDFORMRULE PbooleanMap IS FORM(KbooleanMap) ONCE PbooleanValue() ENDFORMRULE PbooleanValue IS ONCE Pfalse() || Ptrue() || PvalueNameRef() || Pand() || Por() || Pnot() || Pxor() || Pequal() || Pincreasing() || PstrictlyIncreasing() ENDRULE PborderPattern IS FORM(KborderPattern) ONCE PintegerValue() && PintegerValue() && Pboolean() ENDFORMRULE PborderWidth IS FORM(KborderWidth) ONCE PintegerValue() ENDFORMRULE PboundingBox IS FORM(KboundingBox) ONCE Prectangle() ENDFORMRULE Pbuild IS FORM(Kbuild) ONCE PkeywordNameRef() REPEAT Pliteral() || Pactual() || Pbuild() || PforEach() || Pcomment() ENDFORMRULE Pceiling IS FORM(Kceiling) ONCE PnumberValue() ENDFORMRULE Pcell IS ZERO(n) ZERO(m) FORM(Kcell) ONCE PcellNameDef() && PcellType() REPEAT G1(n,Pstatus) || Pview() || G1(m,PviewMap) || Pproperty() || Pcomment() || PuserData() ENDFORMRULE PcellNameDef IS ONCE PnameDef() ENDRULE PcellNameRef IS ONCE PnameRef() ENDRULE PcellRef IS FORM(KcellRef) ONCE PcellNameRef() OPTIONAL PlibraryRef() ENDFORMRULE PcellType IS FORM(KcellType) ONCE MATCH(KGENERIC) || MATCH(KTIE) || MATCH(KRIPPER) ENDFORMRULE Pchange IS FORM(Kchange) ONCE PportNameRef() || PportRef() || PportList() OPTIONAL Ptransition() || Pbecomes() ENDFORMRULE Pcircle IS FORM(Kcircle) ONCE PpointValue() && PpointValue() REPEAT Pproperty() ENDFORMRULE Pcollector IS FORM(Kcollector) ENDFORMRULE Pcolor IS FORM(Kcolor) ONCE PscaledInteger() && PscaledInteger() && PscaledInteger() ENDFORMRULE Pcomment IS CONDFORM(Kcomment, COMMENT) REPEAT PstringToken() ENDFORMRULE PcommentGraphics IS ZERO(n) FORM(KcommentGraphics) REPEAT Pannotate() || Pfigure() || Pinstance() || G1(n,PboundingBox) || Pproperty() || Pcomment() || PuserData() ENDFORMRULE Pcompound IS FORM(Kcompound) REPEAT PlogicNameRef() ENDFORMRULE Pconcat IS FORM(Kconcat) REPEAT PstringValue() ENDFORMRULE PconnectLocation IS FORM(KconnectLocation) REPEAT Pfigure() ENDFORMRULE Pconstant IS FORM(Kconstant) ONCE PvalueNameDef() && PtypedValue() ENDFORMRULE Pconstraint IS FORM(Kconstraint) ONCE PbooleanValue() REPEAT Pproperty() ENDFORMRULE Pcontents IS ZERO(n) FORM(Kcontents) FLAG(Fcont) REPEAT Pinstance() || PoffPageConnector() || Pfigure() || Psection() || Pnet() || PnetBundle() || Ppage() || PcommentGraphics() || PportImplementation() || Ptiming() || Psimulate() || Pwhen() || Pfollow() || PlogicPort() || G1(n,PboundingBox) || Pconstant() || Pconstraint() || Pvariable() || Passign() || Pblock() || Pif() || Piterate() || Pwhile() || Pproperty() || Pcomment() || PuserData() UNFLAG(Fcont) ENDFORMRULE PcornerType IS FORM(KcornerType) ONCE MATCH(KEXTEND) || MATCH(KROUND) || MATCH(KTRUNCATE) ENDFORMRULE Pcriticality IS FORM(Kcriticality) ONCE PintegerValue() || PintegerDisplay() ENDFORMRULE PcurrentMap IS FORM(KcurrentMap) ONCE PmiNoMaxValue() ENDFORMRULE Pcurve IS FORM(Kcurve) REPEAT Parc() || PpointValue() ENDFORMRULE Pcycle IS FORM(Kcycle) ONCE PintegerValue() OPTIONAL Pduration() ENDFORMRULE PdataOrigin IS FORM(KdataOrigin) ONCE PstringToken() OPTIONAL Pversion() ENDFORMRULE PdcFaninLoad IS FORM(KdcFaninLoad) ONCE PnumberValue() || PnumberDisplay() ENDFORMRULE PdcFanoutLoad IS FORM(KdcFanoutLoad) ONCE PnumberValue() || PnumberDisplay() ENDFORMRULE PdcMaxFanin IS FORM(KdcMaxFanin) ONCE PnumberValue() || PnumberDisplay() ENDFORMRULE PdcMaxFanout IS FORM(KdcMaxFanout) ONCE PnumberValue() || PnumberDisplay() ENDFORMRULE Pdelay IS FORM(Kdelay) ONCE PmiNoMaxValue() || PmiNoMaxDisplay() ENDFORMRULE Pdelta IS FORM(Kdelta) REPEAT PpointValue() ENDFORMRULE Pderivation IS FORM(Kderivation) ONCE MATCH(KCALCULATED) || MATCH(KMEASURED) || MATCH(KREQUIRED) ENDFORMRULE Pdesign IS ZERO(n) FORM(Kdesign) ONCE PdesignNameDef() && PcellRef() REPEAT G1(n,Pstatus) || Pproperty() || Pcomment() || PuserData() ENDFORMRULE Pdesignator IS FORM(Kdesignator) ONCE PstringValue() || PstringDisplay() ENDFORMRULE PdesignNameDef IS ONCE PnameDef() ENDRULE Pdifference IS FORM(Kdifference) ONCE PfigureGroupRef() || PfigureOp() REPEAT PfigureGroupRef() || PfigureOp() ENDFORMRULE Pdirection IS FORM(Kdirection) ONCE MATCH(KINOUT) || MATCH(KINPUT) || MATCH(KOUTPUT) ENDFORMRULE Pdisplay IS FORM(Kdisplay) ONCE PfigureGroupNameRef() || PfigureGroupOverride() OPTIONAL Pjustify() OPTIONAL Porientation() OPTIONAL Porigin() ENDFORMRULE Pdivide IS FORM(Kdivide) ONCE PnumberValue() REPEAT PnumberValue() ENDFORMRULE Pdominates IS FORM(Kdominates) REPEAT PlogicNameRef() ENDFORMRULE Pdot IS FORM(Kdot) ONCE PpointValue() REPEAT Pproperty() ENDFORMRULE Pduration IS FORM(Kduration) ONCE PnumberValue() ENDFORMRULE Pe IS FORM(Ke) ONCE PintegerToken() && PintegerToken() ENDFORMPedif IS /* root production rule, called externally */ ZERO(n) FORM(Kedif) ONCE PedifFileNameDef() && PedifVersion() && PedifLevel() && PkeywordMap() REPEAT G1(n,Pstatus) || Pexternal() || Plibrary() || Pdesign() || Pcomment() || PuserData() ENDFORMRULE PedifFileNameDef IS ONCE PnameDef() ENDRULE PedifLevel IS FORM(KedifLevel) ONCE PintegerToken() ENDFORMRULE PedifVersion IS FORM(KedifVersion) ONCE PintegerToken() && PintegerToken() && PintegerToken() ENDFORMRULE Pelse IS FORM(Kelse) REPEAT Pstatement() ENDFORMRULE PenclosureDistance IS FORM(KenclosureDistance) ONCE PruleNameDef() && PfigureGroupObject() && PfigureGroupObject() && (Prange() || PsingleValueSet()) REPEAT Pcomment() || PuserData() ENDFORMRULE PendType IS FORM(KendType) ONCE MATCH(KEXTEND) || MATCH(KROUND) || MATCH(KTRUNCATE) ENDFORMRULE Pentry IS FORM(Kentry) ONCE (Pmatch() || Pchange() || Psteady()) && (PlogicRef() || PportRef() || PnoChange() || Ptable()) OPTIONAL Pdelay() || PloadDelay() ENDFORMRULE Pescape IS FORM(Kescape) ENDFORMRULE Pequal IS FORM(Kequal) ONCE PnumberValue() REPEAT PnumberValue() ENDFORMRULE Pevent IS FORM(Kevent) ONCE PportRef() || PportList() || PportGroup() || PnetRef() || PnetGroup() REPEAT Ptransition() || Pbecomes() ENDFORMRULE Pexactly IS FORM(Kexactly) ONCE PnumberValue() ENDFORMRULE Pexternal IS ZERO(n) FORM(Kexternal) FLAG(Fext) ONCE PlibraryNameDef() && PedifLevel() && Ptechnology() REPEAT G1(n,Pstatus) || Pcell() || Pcomment() || PuserData() UNFLAG(Fext) ENDFORMRULE Pfabricate IS FORM(Kfabricate) ONCE PlayerNameDef() && PfigureGroupNameRef() ENDFORMRULE Pfalse IS FORM(Kfalse) ENDFORMRULE Pfigure IS FORM(Kfigure) ONCE PfigureGroupNameRef() || PfigureGroupOverride() REPEAT Pcircle() || Pdot() || PopenShape() || Ppath() || Ppolygon() || Prectangle() || Pshape() || Pcomment() || PuserData() ENDFORMRULE PfigureArea IS FORM(KfigureArea) ONCE PruleNameDef() && PfigureGroupObject() && (Prange() || PsingleValueSet()) REPEAT Pcomment() || PuserData() ENDFORMRULE PfigureGroup IS ZERO(m) ZERO(n) ZERO(o) ZERO(p) ZERO(q) ZERO(r) ZERO(s) ZERO(t) ZERO(u) FORM(KfigureGroup) ONCE PfigureGroupNameDef() REPEAT G1(m,PcornerType) || G1(n,PendType) || G1(o,PpathWidth) || G1(p,PborderWidth) || G1(q,Pcolor) || G1(r,PfillPattern) || G1(s,PborderPattern) || G1(t,PtextHeight) || G1(u,Pvisible) || PincludeFigureGroup() || Pproperty() || Pcomment() || PuserData() ENDFORMRULE PfigureGroupNameDef IS ONCE PnameDef() ENDRULE PfigureGroupNameRef IS ONCE PnameRef() ENDRULE PfigureGroupObject IS FORM(KfigureGroupObject) ONCE PfigureGroupNameRef() || PfigureGroupRef() || PfigureOp() ENDFORMRULE PfigureGroupOverride IS ZERO(m) ZERO(n) ZERO(o) ZERO(p) ZERO(q) ZERO(r) ZERO(s) ZERO(t) ZERO(u) FORM(KfigureGroupOverride) ONCE PfigureGroupNameRef() REPEAT G1(m,PcornerType) || G1(n,PendType) || G1(o,PpathWidth) || G1(p,PborderWidth) || G1(q,Pcolor) || G1(r,PfillPattern) || G1(s,PborderPattern) || G1(t,PtextHeight) || G1(u,Pvisible) || Pproperty() || Pcomment() || PuserData() ENDFORMRULE PfigureGroupRef IS FORM(KfigureGroupRef) ONCE PfigureGroupNameRef() OPTIONAL PlibraryRef() ENDFORMRULE PfigureOp IS ONCE Pdifference() || Pintersection() || Pinverse() || Poversize() || Punion() ENDRULE PfigurePerimeter IS FORM(KfigurePerimeter) ONCE PruleNameDef() && PfigureGroupObject() && (Prange() || PsingleValueSet()) REPEAT Pcomment() || PuserData() ENDFORMRULE PfigureWidth IS FORM(KfigureWidth) ONCE PruleNameDef() && PfigureGroupObject() && (Prange() || PsingleValueSet()) REPEAT Pcomment() || PuserData() ENDFORMRULE PfillPattern IS FORM(KfillPattern) ONCE PintegerValue() && PintegerValue() && Pboolean() ENDFORMRULE Pfix IS FORM(Kfix) ONCE PnumberValue() ENDFORMRULE Pfloor IS FORM(Kfloor) ONCE PnumberValue() ENDFORMRULE Pfollow IS FORM(Kfollow) ONCE (PportNameRef() || PportRef()) && (PportRef() || Ptable()) OPTIONAL Pdelay() || PloadDelay() ENDFORMRULE PforbiddenEvent IS FORM(KforbiddenEvent) ONCE PtimeInterval() REPEAT Pevent() ENDFORMRULE PforEach IS FORM(KforEach) ONCE PformalNameRef() || PformalList() REPEAT Pbuild() || Pactual() || Pliteral() || PforEach() || Pcomment() ENDFORMRULE Pform IS if (!ISKEYWORD(token->type)) return(FALSE); else add_token(); REPEAT PintegerToken() || PstringToken() || Pidentifier() || Pform() ENDFORMRULE Pformal IS FORM(Kformal) ONCE PformalNameDef() REPEAT Poptional() || Pcollector() ENDFORMRULE PformalList IS FORM(KformalList) REPEAT PformalNameRef() ENDFORMRULE PformalNameDef IS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -