lexemes; begin compCont "-" eol {ignore}; string '"' ([~'"'] | ('"' '"'))+ '"'; opGT '>'; opLT '<'; opLprn '('; opRprn ')'; opPlus '+'; opMinus '-'; opMult '*'; opDiv "div"; keyDelay "delay" ; keyExpect "expect" | "ex" | "e"; keyFitr "fitr"; keyInit "initialize" | "init"; keyInput "input" | "in" | "i"; keyInclude ("include" | "source") [' ' tab]+ [~' ' tab eol ';']+; keyLoad "load"; keyMeasure "measure"; keyOutput "output"| "out" | "o"; keySet "set" | "se" | "s"; keySpice "spice" | "spi" | "sp"; keyTitle "title"; # keyEOW '%' [~eol]* eol; unitpS "psec" | "ps"; unitnS "nsec" | "ns"; unituS "usec" | "us"; unitmS "msec" | "ms"; unitSec "sec"; unitaF "attoFarad" | "aF"; unitpF "picoFarad" | "pF"; unituF "microFarad" | "uF" | "mmF"; unitF "Farad" | "F"; unitmV "milliVolt" | "mVolt" | "mV"; unitV "volt" | "v"; symbol ['a'-'z' '~' '_'] ['a'-'z' '0'-'9' '~' '_']*; macro '&' [tab ' ']* '(' ' '* ([~Eol ',' ' ' tab ')']* (' '* ',' ' '* | ' '*))+ ')'; # spNode ['a'-'z']* '<' ['a'-'z' '0'-'9']+ '>'; # spDir '.' ['a'-'z'] ['a'-'z' '0'-'9'] *; number (['0'-'9']+ | '.' ['0'-'9']+ | ['0'-'9']+ '.' ['0'-'9']*) | ((['0'-'9']+ | '.' ['0'-'9']+ | ['0'-'9']+ '.' ['0'-'9']*) 'e' ((['+''-']['0'-'9']+) | ['0'-'9']+)); colon ':'; comment '#' [~Eol]* {ignore}; white [',' ' ' tab eop]+ {ignore}; eoLine eol {discard}; semi ';' {discard}; absolute '@'; rEdge '/' [~ ' ' tab eop eol ';']*; fEdge '\' [~ ' ' tab eop eol ';']*; refEdge '!' [~ ' ' tab eop eol ';']*; end; productions; begin # Simulation specifications. waveSpec -> waveSpec eos waveStmnt {Name=waveSpecA} | waveStmnt {Name=waveSpecB} ; waveStmnt -> opPlus {Name=owStmntGate}| colon {Name=owStmntComplex} | delayStmnt {Name=nwStmntDelay} | expectStmnt {Name=nwStmntExpect}| fitrStmnt {Name=nwStmntFitr} | initStmnt {Name=nwStmntInit} | inputStmnt {Name=nwStmntInput} | loadStmnt {Name=nwStmntLoad} | measureStmnt {Name=nwStmntMeas} | owExpectStmnt {Name=owStmntExpect}| owInitStmnt {Name=owStmntInit} | owLoadStmnt {Name=owStmntLoad} | outputStmnt {Name=nwStmntOutput}| spiceStmnt {Name=nwStmntSpice} | titleStmnt {Name=nwStmntTitle} | {Name=nwStmntNull} ; delayStmnt -> keyDelay ndName ndName {Name=delayStmnt}; expectStmnt -> keyExpect ndName ExpctBody {Name=expectStmnt}; fitrStmnt -> keyFitr word exp exp exp word word word exp {Name=fitrStmnt}; initStmnt -> keyInit exp ndNamelst {Name=initStmnt}; inputStmnt -> keyInput ndName waveBody {Name=inputStmntPWL} | keyInput ndName exp {Name=inputStmntVOLT}; loadStmnt -> keyLoad ndName explst {Name=loadStmnt}; measureStmnt -> keyMeasure string exp {Name=measureStmnt}; outputStmnt -> keyOutput ndName outBody {Name=outputStmntA} | keyOutput ndName exp outBody {Name=outputStmntB} ; owExpectStmnt -> keyExpect ndName owExpctBody {Name=owExpctStmnt}; owInitStmnt -> keySet exp ndNameLst {Name=owInitStmnt}; owLoadStmnt -> keyOutput ndName explst {Name=owLoadStmnt}; # renameStmnt -> spiceStmnt -> keySpice spiceBody {Name=spiceStmnt}; titleStmnt -> keyTitle string {Name=titleStmnt}; # Subsections of simulation specifications. expctBody -> expctBody expctBody {Name=expctBodyA} | exp opGT exp opLT exp {Name=expctBodyB} | exp opLT exp opGT exp {Name=expctBodyC} | exp opGT exp {Name=expctBodyD} | exp opLT exp {Name=expctBodyE} ; owExpctBody -> owexpctBody refid exp {Name=twoExpctBd} | owexpctBody refid {Name=twoExpctBdB} | refid exp {Name=oneExpctBd} | refid {Name=oneExpctBdB} ; spiceBody -> spiceBody spiceElt {Name=spiceBody} | spiceElt {Name=spiceElt} ; spiceElt -> exp {Name=spiceEltExp}| string {Name=spiceEltString}; outBody -> outBody refId {Name=outBodyA}| refId {Name=outBodyB}; waveBody -> waveBody wavePnt {Name=waveBodyTwo} | wavePnt {Name=waveBodyOne} ; wavePnt-> absolute wavePnt {Name=wavePntAbs} | exp exp {Name=wavePntA} | opLprn exp exp opRprn {Name=wavePntB} | exp refid exp {Name=wavePntARef} | opLprn exp refid exp opRprn {Name=wavePntBRefA}; # Miscellaneous elements. ndName -> symbol {Name=ndNameSymbol} | key {Name=ndNameKey} ; refid -> redge {Name=redgeref} | fedge {Name=fedgeref} | refedge {Name=refEdgeref} ; arglst -> arglst symbol {Name=twoArgs} | symbol {Name=oneArg}; explst -> explst exp {Name=twoExps} | exp {Name=oneExp} ; ndNameLst -> ndNameLst ndName {Name=twoNdNames} | ndName {Name=oneNdName} ; exp -> exp opMult exp {Name=expMult, precedence=2, LeftAssociative} | exp opDiv exp {Name=expDiv, precedence=2, LeftAssociative} | exp opPlus exp {Name=expAdd, precedence=1, LeftAssociative} | exp opMinus exp {Name=expSub, precedence=1, LeftAssociative} | opMinus exp {Name=expNeg, precedence=3, LeftAssociative} | opPlus exp {Name=expPos, precedence=3, LeftAssociative} | opLprn exp opRprn {Name=expGrp} | exp unit {Name=expScl, precedence=4, LeftAssociative} | number {Name=expNumber} | symbol {Name=expSym} ; word -> symbol {Name=wordSym} | key {Name=wordKey} | unit {Name=wordUnit} | string {Name=wordString}; key -> keyDelay {Name=kyDelay} | keyExpect {Name=kyExp} | keyFitr {Name=kyFitr} | keyInit {Name=kyInit} | keyInput {Name=kyInput} | keyLoad {Name=kyLoad} | keyMeasure {Name=kyMeasure}| keyOutput {Name=kyOutput} | keySpice {Name=kySpice} | keyTitle {Name=kyTitle} ; unit -> unitpS {Name=utPS} | unitnS {Name=utNS} | unituS {Name=utUS} | unitmS {Name=utMs} | unitSec {Name=utSec}| unitaF {Name=utAF} | unitpF {Name=utPF} | unituF {Name=utUF} | unitF {Name=utF} | unitmV {Name=utMV} | unitV {Name=utV} ; eos -> semi {Name=eosA} | eoLine {Name=eosB} ; end;