<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.3790.2577" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face=Arial size=2>Since it seems that there may be some interest, and
to prove that I'm not bull-shitting, I thought I would post the code that I
mentioned earlier. It describes a parser for an unnamed object-oriented
language of my design (that rips off a lot of stuff from D). It's actually
less than 230 lines if you don't count the comments and whitespace. It's
all one big string that gets parsed at run-time, but perhaps D could turn it
into optimized source code.</FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><FONT face=Arial
size=2></FONT></FONT></FONT> </DIV>
<DIV><FONT face=Arial><FONT size=2><FONT color=#0000ff>const</FONT> <FONT
color=#0000ff>char</FONT> *languageParser =</FONT></FONT></DIV>
<DIV><FONT face=Arial
size=2>"Real::(!Delims&(-?(/d+(/.(/d)+)?)|(/d*/.(/d)+)([eE][/-+]?/d{1,3})?)@~;)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// A real
number</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Char::(!Delims&(\')@~&((\\)?.)@~\';;)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// char
literal</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Text::(!Delims&(\")@~&([^\".]*)@~\";;)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// text
literal</FONT></FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2></FONT> </DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>//
Delimeters</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Comment1::(//(^(/n).)*)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"Comment2::(/*(^(/*//).)*/*//)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"Delims::(/s(//(!Comment1|!Comment2)/s)*)"</FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><FONT
face=Arial></FONT></FONT></FONT> </DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>//</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>//
Expressions</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>//</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiOp1:([/./^])" </FONT><FONT color=#008000><FONT
face=Arial size=2>// . ^ (exponentiation)</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiOp2:([///*/%/#])" </FONT><FONT
color=#008000><FONT face=Arial size=2>// / div * mul % mod #
concat</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiOp3:([/-+])" </FONT><FONT color=#008000><FONT
face=Arial size=2>// - +</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiOp4:(=|/!=|<|>|<=|>=|in|/~|/!/~)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// = != < > <= >=
in ~ !~</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiOp5:(/&|/||/./.)" </FONT><FONT
color=#008000><FONT face=Arial size=2>// & | .. (range
operator)</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Parens:(/(!Expr/))" </FONT><FONT
color=#008000><FONT face=Arial size=2>// Expression bound by
parenthesis</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"MParam:(((`=)@~&(/i)@~;;=)?!Expr)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"MParens:(&(/()@~(!MParam(,!MParam)*)?/);)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// 0 or more comma delimited
expressions bound by parens</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Index:(&(/[)@~!Expr(,!Expr)*/];)" </FONT><FONT
color=#008000><FONT face=Arial size=2>// Array index</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Tuple1:(&(/[)@~!MParam(,!MParam)*/];)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// Array index
tuple</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Tuple2:(&(/()@~!MParam(,!MParam)*/);)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// Parens
tuple</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Tuple:(!Tuple1|!Tuple2)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"TBang:(&(/!)@~;)" </FONT><FONT
color=#008000><FONT face=Arial size=2>// template instantiation
bang</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"DotExpr:(&(/.)@~;&(/i)@~;)" </FONT><FONT
color=#008000><FONT face=Arial size=2>// dots in an id
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"IdExpr:((`/:idexpr)@~&(/i)@~;(!DotExpr)*(((!TBang)?!MParens)|!Index)*;)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// Id
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"LExpr:(!Real|!Text|!Char|!TypeofExpr|!IdExpr|!Tuple|!Parens|!MethodExpr|!DelegateExpr|!ClosureExpr|!PrefixExpr)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Prefix
operators</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"PrefixOp:([/*/-/!/&]|sizeof|typeid|typeof)"
</FONT></DIV>
<DIV><FONT face=Arial
size=2>"PrefixExpr:(&(!PrefixOp)@~!LExpr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>//
Exponentiation</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"BiExpr1:((`t1)@~!LExpr&(!BiOp1)$~!BiSub2;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Multiplication, division,
and modulus</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiSub2:(!BiExpr1|!LExpr)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BiExpr2:((`t2)@~!BiSub2&(!BiOp2)$~!BiSub3;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Addition and
Subtraction</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiSub3:(!BiExpr2|!BiSub2)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BiExpr3:((`t3)@~!BiSub3&(!BiOp3)$~!BiSub4;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Comparisons == != < >
<= >=</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiSub4:(!BiExpr3|!BiSub3)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BiExpr4:((`t4)@~!BiSub4&(!BiOp4)$~!BiSub5;)"</FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><FONT
face=Arial></FONT></FONT></FONT> </DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// & |
..</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"BiSub5:(!BiExpr4|!BiSub4)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"BiSub6:(!BiExpr5|!BiSub5)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BiExpr5:((`t5)@~!BiSub5&(!BiOp5)$~!BiSub6;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"Keywords:(module|interface|class|enum|static|const|delegate|closure|method)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Type
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"TypeofExpr:(&(typeof)@~!Expr(/.&(/i)@~;)*;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TypeDots:(^(!Keywords)&(/i)@~(/.&(/i)@~;)*;)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"Array:(&(/[)@~(!Expr(,!Expr)*)?/];)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// Array
type</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"Const:((&(/!)@~;)|((const(`/!))@~;))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"MTypeExpr:(((!Const)?(&(/*)@~;|!Array))*(!Const)?(!DelegateType|!ClosureType|!TypeofExpr|!TypeDots))"</FONT></DIV>
<DIV><FONT face=Arial size=2>"TypeExpr:((`/:type)@~!MTypeExpr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// delegate, closure
types</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// @void(int) myDelegate =
@myMethod;</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// @void(int) myDelegate =
@myInstance.myMethod;</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// #void(int) myClosure =
#myMethod(5);</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// #void(int) myDelegate =
#myInstance.myMethod(5);</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"SID:(&(/i)@~;^(/i))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"DParam:((`/:var)@~!TypeExpr(!SID(,!SID)*)?(,;!DParam)?)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"DParens:(/((!DParam;)?/))"</FONT></DIV>
<DIV><FONT face=Arial size=2>"Delegate:(<A>/@|delegate</A>)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"Closure:(/#|closure)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"DelegateType:((<A
href="mailto:`/@)@~!Delegate!TypeExpr!DParens">`/@)@~!Delegate!TypeExpr!DParens</A>;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ClosureType:((`/#)@~!Closure!TypeExpr!DParens;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Anonymous method
expression</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// %void(int a) myDelegate =
%void(int a) Write(a);;</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"AParam:((`/:var)@~!TypeExpr!SID(,!SID)*(,;!AParam)?)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"AParens:(/((!AParam;)?/))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"MethodExpr:((`/%)@~!Method!TypeExpr!AParens!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"DelegateExpr:((`/@)@~!Delegate(!IdExpr/.)?&(/i)@~;;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Closure
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"ClosureExpr:((`/#)@~!Closure!IdExpr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// New
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"NewExpr:(&(new)@~!TypeExpr(!MParens)?;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// CastExpr</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"CastExpr:((`cast)@~!Expr&((!Static)?as)$~!TypeExpr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// An
expression</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"BiOps:(!BiOp1|!BiOp2|!BiOp3|!BiOp4|!BiOp5)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"PreLExpr:(!LExpr^(!BiOps))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"Expr:(^[/]/;/)/}](!PreLExpr|!BiExpr5|!BiExpr4|!BiExpr3|"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"!BiExpr2|!BiExpr1|!NewExpr|!CastExpr))"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>//</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>//
Statements</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>//</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Assignment
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"AssOp:(=|/+=|/-=|/*=|//=|/^=)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"AssSt:((`ass)@~!IdExpr(&(!AssOp)$~)!Expr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Delete
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"DeleteSt:(&(delete)@~!IdExpr;/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Return, break, continue
statements</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"ReturnSt:(&(return)@~(!Expr)?;/;)"
</FONT></DIV>
<DIV><FONT face=Arial size=2>"BreakSt:(&(break)@~;/;)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"ContinueSt:(&(continue)@~;/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Postfix
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"PostfixOp:(/+/+|/-/-)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"PostfixSt:((`pf)@~!IdExpr&(!PostfixOp)$~;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Variable declaration
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"Var:(&(/i)@~(=(!NewExpr|!Expr))?;)"
</FONT><FONT color=#008000><FONT face=Arial size=2>// var =
expr</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"Static:((&(/$)@~;)|(static(`/$)@~;))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"VarSt:((`/:var)@~(!Static)?!TypeExpr!Var(,!Var)*;/;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"SVarSt:((`/:var)@~!TypeExpr!Var(,!Var)*;/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// If
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"IfSt:(&(if)@~!Expr(/:)?!Block(else!Block)?;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Static if
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"SIfSt:(&(!Static(if))@~!Expr(/:)?!Block(else!Block)?;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Switch
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"CaseSt:((`case)@~(case)?!Expr*(/:)?!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"DefaultSt:(&(default)@~(/:)?!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"SwitchSt:(&(switch)@~/{(!CaseSt)*(!DefaultSt)?/};)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// While
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"WhileSt:(&(while)@~!Expr!Block;)"
</FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><FONT
face=Arial></FONT></FONT></FONT> </DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Do
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"DoSt:(&(do)@~!Block(while)!Expr;/;)"</FONT></DIV>
<DIV><FONT face=Arial><FONT size=2><FONT
face=Arial></FONT></FONT></FONT> </DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Method call
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"MethodSt:((`/(/))@~!IdExpr;/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Foreach statement
</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"FEVarDecl:((`/:var)@~!TypeExpr&(/i)@~;;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ForeachHeader:(!FEVarDecl(,!FEVarDecl;)?/;!Expr(&(step)@~!Expr;)?)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ForeachSt:(&(foreach)@~/(!ForeachHeader/)!Block(else!Block);)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// For
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"FVarDecl:((`/:var)@~!TypeExpr&(/i)@~;(=!Expr);)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"ForInit:(!FVarDecl|!AssSt)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"FStatement:(!AssSt|!PostfixSt)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ForSt:(&(for)@~/((!ForInit(,!ForInit)*)?/;!Expr/;(!FStatement(,!FStatement)*)?/)!Block;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// In and out blocks can
include preconditions and postconditions </FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"InBlock:(&(in)@~!Block;)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"OutBlock:(&(out)@~!Block;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Trace
block</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"TraceBlock:(&(trace)@~!Block;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Echo,
assert</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"EchoSt:(&(echo)@~!Expr;)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"AssertSt:(&(assert)@~!Expr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>//
Exceptions</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"CatchSt:((`catch)@~(catch)?&(/i)@~;*(/:)?!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"DefaultSt:(&(default)@~(/:)?!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TryBlock:(&(try)@~/{(!CatchSt)*(!DefaultSt)?/};)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"ThrowSt:(&(throw)@~;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Enumeration
definition</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"EnumNode:(&(/i)@~(=!Expr);)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"EnumDef:(&(enum)@~/{!EnumNode(,!EnumNode)*/};)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Method
definition</FONT></DIV></FONT>
<DIV><FONT face=Arial size=2>"TID:(&(/i)@~^(/i)(=!Expr)?;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TParam:((`/:var)@~(&(in|out|inout)@~;)?!TypeExpr!TID(,!TID)*(,;!TParam)?)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"TParens:(/((!TParam;)?/))"</FONT></DIV>
<DIV><FONT face=Arial size=2>"Method:(/%|method)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"SMethodDef:((`/%)@~!Method!TypeExpr&(/i)@@~;!TParens!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"MMethodDef:((`/%)@~(!Static|!Const)?!Method!TypeExpr&(/i)@@~;!TParens!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"IMethodDef:((`/%)@~(!Const)?!Method!TypeExpr&(/i)@@~;!TParens/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Construct:(&(construct)@~!Block;)"</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Destruct:(&(destruct)@~!Block;)"</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Startup:..."</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Terminate:..."</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Set:(&(set)@~!TParens!Block;)"</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial
size=2>//"Get:(!TypeExprget!Block;)"</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Operator
overloading</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"OpOverload:(&(operator)@~(!PrefixO|!PostfixO|!AssignO|!BinaryO)!Block;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BinaryO:(&(^(/.)!BiOps)@~;!TypeExpr/(!TypeExpr&(/i)@~;,!TypeExpr&(/i)@~;/))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"AssignO:(&(^(=)!AssOp)@~;void/(!TypeExpr&(/i)@~;/))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"PrefixO:(&(/-/!)@~;!TypeExpr/(/))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"PostfixO:(&(/+/+|/-/-)@~;void/(/))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"BinaryOverload:(&(operator)@~!BinaryO!Block;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Class
definition</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"ProtSt:(&(public|private|protected)@~;/:)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ClassSt:(!ProtSt|!Alias|!TypeDef|!VarSt|!MMethodDef|!ClassDef|!EnumDef|!InterfaceDef|!OpOverload)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ClassBlock:(&(/{)@~(!ClassSt)*/};)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TemplateParam:((&(int)@~;)?(&(/i)@~;))"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TemplateParams:(!TemplateParam(,!TemplateParam)*)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ClassDef:(&(class)@~&(/i)@~(/(!TemplateParams/))?;(/:!IdExpr(,!IdExpr)*)?!ClassBlock;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// Interface
definition</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"InterfaceSt:(!ProtSt|!Alias|!TypeDef|!IMethodDef|!ClassDef|!EnumDef|!InterfaceDef)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"InterfaceBlock:(&(/{)@~(!InterfaceSt)*/};)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"InterfaceDef:(&(interface)@~&(/i)@~;(/:!IdExpr(,!IdExpr)*)?!InterfaceBlock;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"Alias:(&(alias)@~&(/i)@~;=!TypeExpr;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"TypeDef:(&(typedef)@~&(/i)@~;=!TypeExpr;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// import</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"ImportNode:(&(/i)@~(/.&(/i)@@~;)*;)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ImportSt:(&(import)@~!ImportNode(,!ImportNode)*;/;)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// error checking,
exceptions</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// in, out, inout
params</FONT></DIV></FONT>
<DIV><FONT color=#008000><FONT face=Arial size=2>// in, out code
blocks</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"ModuleInit:(&(module)@~&(/i)@@~;/:)"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"ModuleSt:(!ProtSt|!Alias|!TypeDef|!ImportSt|!SVarSt|!SMethodDef|!ClassDef|"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"!EnumDef|!InterfaceDef|!BinaryOverload)"</FONT></DIV>
<DIV><FONT face=Arial size=2>"ModuleDef:(!ModuleInit(!ModuleSt)*)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// A
statement</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"Statement:(!IfSt|!ForSt|!ForeachSt|(!PostfixSt/;)|(!AssSt/;)|!MethodSt|"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"!VarSt|!InBlock|!OutBlock|!TraceBlock|!TryBlock|!ThrowSt|!EchoSt|"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"!AssertSt|!SwitchSt|!WhileSt|!DoSt|!ReturnSt|!BreakSt|!ContinueSt|"</FONT></DIV>
<DIV><FONT face=Arial
size=2>"!DeleteSt|!SIfSt|!EnumDef|!SMethodDef|!ClassDef)"</FONT></DIV>
<DIV><FONT color=#008000><FONT face=Arial size=2>// A statement
block</FONT></DIV></FONT>
<DIV><FONT face=Arial
size=2>"Block:((`/{)@~(/{(!Statement)*/}|!Statement);)";</FONT></DIV></BODY></HTML>