lexemes; begin string '"' ([~'"'] | ('"' '"'))+ '"'; opGT '>'; opLT '<'; opLprn '('; opRprn ')'; opPlus '+'; opMinus '-'; opMult '*'; opDiv "div"; keyActive "active"; keyDelay "delay"; keyExpect "expect"; keyFitr "fitr"; keyInit "initialize"; keyInput "input"; keyLoad "load"; keyMeasure "measure"; keyOutput "output"; keySpice "spice"; keyTitle "title"; keyVersion "asw" ' '+ "version:"; 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 ')']* (' '* ',' ' '* | ' '*))+ ')'; 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 eol]+ {ignore}; eos ';' | ('%' [~eol]* eol) {discard}; absolute '@'; rEdge '/' [~ ' ' tab eop eol ';']*; fEdge '\' [~ ' ' tab eop eol ';']*; refEdge '!' [~ ',' ' ' tab eop eol ';']*; end; productions; begin # Simulation specifications. waveSpec -> versionStmnt simBody {Name=waveSpec} ; simBody -> simBody eos simStmnt {Name=simBodyA} | simStmnt {Name=simBodyB} ; versionStmnt -> keyVersion number {Name=stmntVersion}; simStmnt -> activeStmnt {Name=stmntActive}| delayStmnt {Name=stmntDelay} | expectStmnt {Name=stmntExpect}| fitrStmnt {Name=stmntFitr} | initStmnt {Name=stmntInit} | inputStmnt {Name=stmntInput} | loadStmnt {Name=stmntLoad} | measureStmnt {Name=stmntMeas} | outputStmnt {Name=stmntOutput}| spiceStmnt {Name=stmntSpice} | titleStmnt {Name=stmntTitle} | {Name=stmntNull} ; activeStmnt -> keyActive ndNameLst colon waveBody {Name=activeStmntA} | keyActive ndNameLst colon exp {Name=activeStmntB} ; delayStmnt -> keyDelay ndNameLst colon word {Name=delayStmnt} ; expectStmnt -> keyExpect ndNameLst colon ExpctBody {Name=expectStmnt}; fitrStmnt -> keyFitr text exp exp exp word word word exp {Name=fitrStmntA}| keyFitr text exp exp exp opLprn ndNameLst opRprn word word exp {Name=fitrStmntB}; initStmnt -> keyInit ndNameLst colon exp {Name=initStmnt}; inputStmnt -> keyInput ndNameLst colon waveBody {Name=inputStmntA}| keyInput ndNameLst colon exp {Name=inputStmntB}; loadStmnt -> keyLoad ndNameLst colon explst {Name=loadStmnt} ; measureStmnt -> keyMeasure string exp {Name=measureStmnt}; outputStmnt -> keyOutput ndNameLst colon outBody {Name=outputStmntA} | keyOutput ndNameLst colon exp outBody {Name=outputStmntB} ; 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} ; 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=waveBodyA} | waveBody refid wavePnt {Name=waveBodyB} | wavePnt {Name=waveBodyC} ; wavePnt-> exp exp {Name=wavePntA} | opLprn exp exp opRprn {Name=wavePntB} | absolute exp exp {Name=wavePntC} | opLprn absolute exp exp opRprn {Name=wavePntD} ; # Miscellaneous elements. ndNameLst -> opLprn ndNames opRprn {Name=ndNameLstA} | ndNames {Name=ndNameLstB} ; ndNames -> ndNames ndNames {Name=ndNamesA} | word opMult {Name=ndNamesB} | word {Name=ndNamesC} ; refid -> redge {Name=redgeref} | fedge {Name=fedgeref} | refedge {Name=refEdgeref} ; explst -> explst exp {Name=twoExps} | exp {Name=oneExp} ; 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} ; text -> word {Name=textWord} | string {Name=textString}; word -> symbol {Name=wordSym} | unit {Name=wordUnit} | keyword {Name=wordKey} ; keyword -> keyActive {Name=kwAC} | keyDelay {Name=kwDy} | keyExpect {Name=kwEx} | keyFitr {Name=kwFt} | keyInit {Name=kwIn} | keyInput {Name=kwIp} | keyLoad {Name=kwLd} | keyMeasure {Name=kwMs} | keyOutput {Name=kwOp} | keySpice {Name=kwSp} | keyTitle {Name=kwTl} | keyVersion {Name=kwVn} ; 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} ; end;