2007-11-26 21:56:26 -05:00
|
|
|
! Copyright (C) 2007 Chris Double.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-03-03 15:32:37 -05:00
|
|
|
USING: kernel arrays strings math.parser sequences
|
2008-03-19 21:22:14 -04:00
|
|
|
peg peg.ebnf peg.parsers memoize namespaces math ;
|
2007-11-26 21:56:26 -05:00
|
|
|
IN: peg.pl0
|
|
|
|
|
|
|
|
#! Grammar for PL/0 based on http://en.wikipedia.org/wiki/PL/0
|
2007-11-26 22:45:32 -05:00
|
|
|
|
2008-03-20 00:11:09 -04:00
|
|
|
EBNF: pl0
|
2008-04-01 20:50:29 -04:00
|
|
|
_ = (" " | "\t" | "\n")* => [[ drop ignore ]]
|
2008-04-01 22:47:30 -04:00
|
|
|
|
|
|
|
BEGIN = "BEGIN" _
|
|
|
|
CALL = "CALL" _
|
|
|
|
CONST = "CONST" _
|
|
|
|
DO = "DO" _
|
|
|
|
END = "END" _
|
|
|
|
IF = "IF" _
|
|
|
|
THEN = "THEN" _
|
|
|
|
ODD = "ODD" _
|
|
|
|
PROCEDURE = "PROCEDURE" _
|
|
|
|
VAR = "VAR" _
|
|
|
|
WHILE = "WHILE" _
|
|
|
|
EQ = "=" _
|
|
|
|
LTEQ = "<=" _
|
|
|
|
LT = "<" _
|
|
|
|
GT = ">" _
|
|
|
|
GTEQ = ">=" _
|
|
|
|
NEQ = "#" _
|
|
|
|
COMMA = "," _
|
|
|
|
SEMICOLON = ";" _
|
|
|
|
ASSIGN = ":=" _
|
|
|
|
|
|
|
|
ADD = "+" _
|
|
|
|
SUBTRACT = "-" _
|
|
|
|
MULTIPLY = "*" _
|
|
|
|
DIVIDE = "/" _
|
|
|
|
|
|
|
|
LPAREN = "(" _
|
|
|
|
RPAREN = ")" _
|
|
|
|
|
|
|
|
block = ( CONST ident EQ number ( COMMA ident EQ number )* SEMICOLON )?
|
|
|
|
( VAR ident ( COMMA ident )* SEMICOLON )?
|
|
|
|
( PROCEDURE ident SEMICOLON ( block SEMICOLON )? )* statement
|
|
|
|
statement = ( ident ASSIGN expression
|
|
|
|
| CALL ident
|
|
|
|
| BEGIN statement ( SEMICOLON statement )* END
|
|
|
|
| IF condition THEN statement
|
|
|
|
| WHILE condition DO statement )?
|
|
|
|
condition = ODD expression
|
|
|
|
| expression (EQ | NEQ | LTEQ | LT | GTEQ | GT) expression
|
|
|
|
expression = (ADD | SUBTRACT)? term ( (ADD | SUBTRACT) term )* _
|
|
|
|
term = factor ( (MULTIPLY | DIVIDE) factor )*
|
|
|
|
factor = ident | number | LPAREN expression RPAREN
|
|
|
|
ident = (([a-zA-Z])+) _ => [[ >string ]]
|
|
|
|
digit = ([0-9]) => [[ digit> ]]
|
|
|
|
number = ((digit)+) _ => [[ 10 digits>integer ]]
|
|
|
|
program = _ block "."
|
2008-03-20 00:11:09 -04:00
|
|
|
;EBNF
|