home *** CD-ROM | disk | FTP | other *** search
- begin: ignore(blanks)
- pr1: comment\pr1
- parse(first)\pr2
- diag(error)
- pr2: comment\pr2
- parse(line)\pr2
- diag(error)\pr2
- putcharcl
- parse(last);
-
- first: parse(( fref = {<1 > 1 *}))
- getfref line = { 2<:> 1 };
-
- error: smark ignore(none) any(!<<>>) string(!<<;>>) scopy
- ( <;> = {<;>} | null )
- = { * <??? > 2 1 * };
-
- line:
- labels
- ( charcl <;>
- | statement
- | numbers
- | trule <;> )
- = { 2 * 1 * };
-
- numbers: number <;> numbers/done = { 2 * 1 };
-
- labels: label labels/done = { 2 * 1 };
-
- label: name <:> = { 1 <:> };
-
- last: = { <.pn:1 .pxs;12> *
- <.tn:1 .txs;12> * };
-
- comment: </*>
- co1: ignore(!<<*>>) <*> ignore(none) </>/co1;
-
- statement: [csym=0] oldtab(dtt) oldtab(pat)
- ( proc plst tlst <)> = (1){2 1 }
- | = (1){} noelem )
- stt1: bundle ( frag = (1){ 2(nil) * 1(q1) }\stt1
- | <;> ( ifelem = { 1(xbit) }
- | ={ 1(nil) * <1 succ> }
- ) );
-
- proc: smark ignore(none) <proc(>;
-
- plst: list(pident)/null remote((octal(npa)))
- = { <params;> 1 * };
-
- pident: ident newtab(pat,npa);
-
- tlst: <;>/null [i=0] list((name [i++])) remote((octal(i)))
- = { <push;> 1 * 2 * };
-
- frag: prule = (1){ 1(nil,q1) }
- | labels noelem = (1){ 1 };
-
- /*in sequel q2 is where to go on fail,q1 is exit bit*/
-
- prule: [sndt=ndt] disj
- ( <|> [ndt=sndt] fref
- ( ifeasy prule = (2){3(nil,nil)*<salt;>2*
- 1(q2,q1)*2<:>}
- | prule fref = (2){4({*<alt;>1},q1)*<goto;>3*
- 1<:>2(q2,q1)*3<:>} )
- noelem
- | () );
-
- disj: pelem pdot
- ( disj = (2){2(q2,nil) * 1(nil,q1)} ifelem/done ishard
- | () );
-
- pelem: pprim = (2){1(q1)$2} iseasy
- | <(> push(1,sndt)
- ( prule <)>
- | <)> = (2){} noelem );
-
- pprim: ( special
- | rname ( <:> fail
- | (spdot|()) ignore(none)
- ( <(> ignore(blanks) list(parg) <)>
- = (1){$1 2 * 1}
- | = (1){$1 1} )))
- ( (</> = {<alt;>} | <\>={<salt;>})
- rname = (1){3(nil)*$1 2 1}
- | () );
-
- pdot: <.>/done ignore(none) ident\alias
- ([dtt?] | table(dtt) [ndt=0]) [ndt++];
- spdot: <.> ignore(none) not(( any(letter) ))
- alias: newtab(dtt,ndt);
-
- parg: rname | remote(specparg);
-
- specparg: number
- | charcl
- | <<> longlit
- | <*> = { <\n\0> }
- | <(> ( <)> = {<1 succ>}
- | push(3,dtt,ndt,sndt) [dtt=0]
- prule <)> oldtab(dtt)
- ( ifelem = {1(nil,xbit) }
- | = {1(nil,nil)*<1 succ>}
- ) );
-
- iseasy: [easy = 1];
- ishard: [easy = 0];
- noelem: [easy = 2];
- ifelem: [easy!=2?];
- ifeasy: [easy==1?];
-
- special: <=> (rname | remote(trule))
- = (1){ $1 <trans;1 > 1 }
- | <<> literal = (1){ $1 <.px> 1 }
- | <*> = (1){ $1 <.pn> }
- | <[> expr
- ( <?> = {<.t>}
- | = {<.p>} )
- <]> = (1){ 2 * $1 1 };
-
- rname: ( name tabval(pat,npa)/done
- | <$> number )
- = { <[-> 1 <\<1]> };
-
- trule: oldtab(ptt)
- ( tbody
- | <(> (number|tra) <)> tbody = {<gpar;> 2 * 1 } );
- tra: list(tident) octal(npt);
-
- tident: ident newtab(ptt,npt);
-
- tbody: <{> ( <}> = { <1 generate> }
- | trb);
- trb: telem ( <}> = { xbit 1 }
- | trb = { 2 * 1 } );
-
- telem: <<> literal = { <.tx> 1 }
- | <*> = {<.tn>}
- | <$> number = { <.tq;> 1 }
- | number tdot = tpt
- | name te1\done te2\done;
-
- te1: tabval(dtt,ndt) tdot = tpt;
- te2: tabval(ptt,npt) = {<.tq;>1};
-
- tdot: (<.> number | ={<0>})
- ( <(> list(targ) <)> | null)
- = { 2 <;> 1 };
-
- targ: name|remote(tbody);
-
- tpt: { <.tp;.byte > 2 <,> 1 };
-
- literal: ( shortlit
- | remote(longlit) = { <;> 1} );
-
- shortlit: ignore(none) smark any(litch) <>> scopy = { <s;'> 1 };
-
- longlit: ignore(none) (<>> = { <\> <>> } | null) litb <>>
- = { <<> 2 1 <\0> <>;.even> };
-
- litb: smark string(litch) scopy <\>/done
- litb = { 2 <\\> 1 };
-
- expr: assignment | rv ;
-
- assignment: lv assign expr = { 3 * 1 * 2 };
-
- rv: prime
- rv1: bundle ( infix prime = { 3 * 1 * 2 }\rv1
- | rva = { 2 * 1 }
- | () );
- rva: <?> rv <:> rv fref fref
- = { <.t;alt;> 2 * 4 * <salt;> 1 * 2 <:> 3 * 1 <:> };
-
- prime:
- lv suffix/done = { 2 * 1 }
- | prefix lv = { 1 * 2 }
- | <(> expr <)>
- | unary prime = { 1 * 2 }
- | remote(number) = { <.l;> 1 };
-
- lv: ( rname = { <.l;> 1 }
- | <(> lv <)>
- | <*> prime = { 1 * <.rv> } )
- lv1: <[>/done bundle expr <]> = { 2 * 1 * <.f> }\lv1;
-
- assign: <=> ignore(none) ( infix = { 1 * <.u> }
- | = { <.st> } );
-
- infix: smark ignore(none)
- ( <+> not((<+> not((<+>)) )) = {<.a>}
- | <-> = {<.s>}
- | <*> = {<.m>}
- | </> = {<.q>}
- | <%> = {<.r>}
- | <|> = {<.o>}
- | <^> = {<.x>}
- | <&> = {<.n>}
- | <==> = {<.eq>}
- | <!=> = {<.ne>}
- | <<=> = {<.le>}
- | <>=> = {<.ge>}
- | <<<> = {<.sl>}
- | <<> = {<.lt>}
- | <>> ( <>> = {<.sr>}
- | = {<.gt>} )
- );
-
- prefix: smark ignore(none)
- ( <&> = {<.lv>}
- | <++> = {<.ib>}
- | <--> = {<.db>}
- );
-
- suffix: smark ignore(none)
- ( <++> = {<.ia>}
- | <--> = {<.da>}
- );
-
- unary: ( <!> = {<.nt>}
- | <-> = {<.ng>}
- | <~> = {<.cm>}
- );
-
- charcl:
- ( <!> ccla cclb | ccla )
- octal(classmask);
- ccla: (<<<>) [classmask = 1<<nclass++] [classmask?]/cherr
- ccl1: cclc <<<>\ccl1;
- cclc: ignore(none)
-
- ccl3: <>>\ccl4 ccle\ccl3;
- ccl4: (<>> | cclx fail) (not((<>>)) | ccle);
- ccle: char(n) [*(2*n+&classes) =| classmask];
- cclb: zeron
- ccl5: [*(&classes+n) =^ classmask] testn\ccl5;
- cclx: [nclass--] zeron
- ccl6: [*(&classes+n) =& ~classmask] testn\ccl6;
- cherr: diag(( ={<too many char classes>} ));
-
- zeron: [n=0];
- testn: [(n=+2)<400?];
-
- putcharcl: zeron [classes=0]
- parse(( = { * <.globl classtab> * <classtab:> * } ))
- ptc1: [w = *(&classes+n)] parse((octal(w) = {1*}))
- bundle testn\ptc1;
-
- classmask: 0;
- nclass: 0;
- classes:
- cl1: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl2: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl3: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl4: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl5: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl6: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl7: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
- cl8: 0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
-
- done: ;
-
- create: [csym++]
- getcsym: octal(csym) = {<.> 1};
-
- fref: [fsym++]
- getfref: octal(fsym) = { <..> 1 };
-
- not: params(1) $1/done fail;
-
- list: params(1) $1
- list1: bundle <,>/done $1 = { 2 * 1 }\list1;
-
- remote: params(1) create parse(rem1,$1);
- rem1: params(1) getcsym $1 = { 2 <=.> * 1 * };
-
- number: smark ignore(none) any(digit) string(digit) scopy;
-
- name: ident scopy;
-
- ident: smark ignore(none) any(letter) string(alpha);
-
- oldtab: params(1) [$1?]/done discard($1) [$1=0];
-
- newtab: params(2) ([$2?] | table($2) [$1=0])
- enter($2,i) [$2[i] = $1++];
-
- tabval: params(2) [$2?] find($2,i) [i=$1-$2[i]] octal(i);
-
- null: = nil;
-
- xbit: {<1 >};
-
- q1: { $1 };
- q2: { $2 };
-
- nil: {};
-
- blanks: <<
- >>;
- digit: <<0123456789>>;
- letter: <<abcdefghijklmnopqrstuvwxyz>>
- <<ABCDEFGHIJKLMNOPQRSTUVWXYZ>>;
- alpha: <<0123456789>>
- <<abcdefghijklmnopqrstuvwxyz>>
- <<ABCDEFGHIJKLMNOPQRSTUVWXYZ>>;
- litch: !<<\>>>;
- none: <<>>;
-
- csym: 0;
- fsym: 0;
- easy: 0;
- w: 0;
- n: 0;
- dtt: 0; /*delivered translation table*/
- ndt: 0; /*numb of delivered translations*/
- sndt: 0; /*saved ndt at beginning of disjunctive term*/
- pat: 0; /*parsing rule parameter table*/
- npa: 0; /*number of parsing rule params*/
- ptt: 0; /*table of params of translation*/
- npt: 0; /*number of params of translation*/
- i: 0;
-