27 lines
1.0 KiB
Factor
27 lines
1.0 KiB
Factor
! Copyright (C) 2007 Chris Double.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: kernel arrays strings math.parser sequences
|
|
peg peg.ebnf peg.parsers memoize namespaces math ;
|
|
IN: peg.pl0
|
|
|
|
#! Grammar for PL/0 based on http://en.wikipedia.org/wiki/PL/0
|
|
|
|
EBNF: pl0
|
|
block = ( "CONST" ident "=" number ( "," ident "=" number )* ";" )?
|
|
( "VAR" ident ( "," ident )* ";" )?
|
|
( "PROCEDURE" ident ";" ( block ";" )? )* statement
|
|
statement = ( ident ":=" expression | "CALL" ident |
|
|
"BEGIN" statement (";" statement )* "END" |
|
|
"IF" condition "THEN" statement |
|
|
"WHILE" condition "DO" statement )?
|
|
condition = "ODD" expression |
|
|
expression ("=" | "#" | "<=" | "<" | ">=" | ">") expression
|
|
expression = ("+" | "-")? term (("+" | "-") term )*
|
|
term = factor (("*" | "/") factor )*
|
|
factor = ident | number | "(" expression ")"
|
|
ident = (([a-zA-Z])+) [[ >string ]]
|
|
digit = ([0-9]) [[ digit> ]]
|
|
number = ((digit)+) [[ unclip [ swap 10 * + ] reduce ]]
|
|
program = block "."
|
|
;EBNF
|