cpp-peglib/grammar/pl0.peg
2015-07-30 17:28:13 -04:00

37 lines
1.1 KiB
Plaintext

program <- _ block '.' _
block <- const var procedure statement
const <- ('CONST' _ ident '=' _ number (',' _ ident '=' _ number)* ';' _)?
var <- ('VAR' _ ident (',' _ ident)* ';' _)?
procedure <- ('PROCEDURE' _ ident ';' _ block ';' _)*
statement <- (assignment / call / statements / if / while / out / in)?
assignment <- ident ':=' _ expression
call <- 'CALL' _ ident
statements <- 'BEGIN' _ statement (';' _ statement )* 'END' _
if <- 'IF' _ condition 'THEN' _ statement
while <- 'WHILE' _ condition 'DO' _ statement
out <- ('out' / 'write' / '!') _ expression
in <- ('in' / 'read' / '?') _ ident
condition <- odd / compare
odd <- 'ODD' _ expression
compare <- expression compare_op expression
compare_op <- < '=' / '#' / '<=' / '<' / '>=' / '>' > _
expression <- sign term (term_op term)*
sign <- < [-+]? > _
term_op <- < [-+] > _
term <- factor (factor_op factor)*
factor_op <- < [*/] > _
factor <- ident / number / '(' _ expression ')' _
ident <- < [a-z] ([a-z] / [0-9])* > _
number <- < [0-9]+ > _
~_ <- [ \t\r\n]*