Author: pmichaud
Date: Thu May 31 10:48:34 2007
New Revision: 18703
Modified:
trunk/languages/abc/src/abc-2.pg
Log:
[abc]:
* More drafts on grammar/token syntax.
Modified: trunk/languages/abc/src/abc-2.pg
==============================================================================
--- trunk/languages/abc/src/abc-2.pg (original)
+++ trunk/languages/abc/src/abc-2.pg Thu May 31 10:48:34 2007
@@ -10,7 +10,7 @@
## - handle lvalue contexts
## It won't even parse yet, so don't try. :-)
-token TOP { <program> { return $<program> }; }
+token TOP { <program> {*} }
## recognize terms
token float { [ \d+ '.' \d* | '.' \d+ ] {*} }
@@ -94,71 +94,73 @@
{*}
}
-token circumfix:sym<( )> is equiv(&term)
- is pirop('set')
- { ... }
+token term:<> is prec('z=') { ... }
+
+token circumfix:<( )> is equiv(&term:<>) is pirop('set') { ... }
## autoincrement
-token postfix:sym<++> is looser(&circumfix:<( )>)
+token postfix:<++> is looser(&circumfix:<( )>)
is lvalue(1)
{ ... }
-token postfix:sym<--> is equiv(&postfix:<++>) is lvalue(1) { ... }
-token prefix:sym<++> is equiv(&postfix:<++>) is lvalue(1) { ... }
-token prefix:sym<--> is equiv(&postfix:<++>) is lvalue(1) { ... }
+token postfix:<--> is equiv(&postfix:<++>) is lvalue(1) { ... }
+token prefix:<++> is equiv(&postfix:<++>) is lvalue(1) { ... }
+token prefix:<--> is equiv(&postfix:<++>) is lvalue(1) { ... }
## negation
-token prefix:sym<-> is looser(&postfix:<++>)
+token prefix:<-> is looser(&postfix:<++>)
is pirop('neg')
{ ... }
## exponentiation
-token infix:sym<^> is looser(&prefix:<->) { ... }
+token infix:<^> is looser(&prefix:<->) { ... }
## multiplicative
-token infix:sym<*> is looser(&infix:<^>)
+token infix:<*> is looser(&infix:<^>)
is pirop('mul')
{ ... }
-token infix:sym</> is equiv(&infix:<*>)
+token infix:</> is equiv(&infix:<*>)
is pirop('div')
{ ... }
-token infix:sym<%> is equiv(&infix:<*>)
+token infix:<%> is equiv(&infix:<*>)
is pirop('mod')
{ ... }
## additive
-token infix:sym<+> is looser(&infix:<*>)
+token infix:<+> is looser(&infix:<*>)
is pirop('add')
{ ... }
-token infix:sym<-> is equiv(&infix:<+>)
+token infix:<-> is equiv(&infix:<+>)
is pirop('sub')
{ ... }
## assignment
-token infix:sym<=> is looser(&infix:<+>)
+token infix:<=> is looser(&infix:<+>)
is assoc('right')
is past('assign')
is lvalue(1)
{ ... }
## relational
-token infix:sym<==> is looser(&infix:<=>)
+token infix:<==> is looser(&infix:<=>)
is assoc('non')
{...}
-proto 'infix:==' is looser('infix:=') is assoc('non') { ... }
-proto 'infix:!=' is equiv('infix:==') { ... }
-proto 'infix:<' is equiv('infix:==') { ... }
-proto 'infix:<=' is equiv('infix:==') { ... }
-proto 'infix:>' is equiv('infix:==') { ... }
-proto 'infix:>=' is equiv('infix:==') { ... }
+token infix:<!=> is equiv(&infix:<==>) { ... }
+token infix:«<» is equiv(&infix:<==>) { ... }
+token infix:«<=» is equiv(&infix:<==>) { ... }
+token infix:«>» is equiv(&infix:<==>) { ... }
+token infix:«>=» is equiv(&infix:<==>) { ... }
## boolean
-proto 'prefix:!' is looser('infix:==') is pirop('not') is
returns('.Integer') { ... }
-proto 'infix:&&' is looser('prefix:!') is assoc('left') { ... }
-proto 'infix:||' is looser('infix:&&') is assoc('left') { ... }
+token prefix:<!> is looser(&infix:<==>)
+ is pirop('not')
+ is returns('.Integer')
+ { ... }
+token infix:<&&> is looser(&prefix:<!>) is assoc('left') { ... }
+token infix:<||> is looser(&infix:<&&>) is assoc('left') { ... }
## vim: expandtab sw=4