pLERO

Language for Grammar Refactoring Patterns

User Tools

Site Tools


grammar-language

pLERO grammar format

Grammars for pLERO are written in a simple format based on BNF. Each rule has the following form:

[nonterminal] ::= [sequence_of_terminals_and_nonterminals]

Terminals must be enclosed in apostrophes.

Examples

Expression language

Expr ::= Expr '+' Expr
Expr ::= Expr '-' Expr
Expr ::= Expr '*' Expr
Expr ::= Expr '/' Expr
Expr ::= Term
Term ::= Int
Term ::= '(' Expr ')'
Int ::= N
Int ::= N Int
N ::= '0'
N ::= '1'
N ::= '2'
N ::= '3'
N ::= '4'
N ::= '5'
N ::= '6'
N ::= '7'
N ::= '8'
N ::= '9'

Fragment of Algol 60 grammar

term ::= factor
term1 ::= term multiplying_operator factor
multiplying_operator ::= 'x'
multiplying_operator ::= '/'
multiplying_operator ::= '÷'
factor ::= primary
factor ::= factor '↑' primary
primary ::= unsigned_number
primary ::= variable
primary ::= function_designator
primary ::= '(' arithmetic_expression ')'

Full Algol 60 grammar

Based on the Modified Report on the Algorithmic Language Algol 60

basic_symbol ::= letter
basic_symbol ::= digit
basic_symbol ::= logical value
basic_symbol ::= delimiter

letter ::= 'a'
letter ::= 'b'
letter ::= 'c'
letter ::= 'd'
letter ::= 'e'
letter ::= 'f'
letter ::= 'g'
letter ::= 'h'
letter ::= 'i'
letter ::= 'j'
letter ::= 'k'
letter ::= 'l'
letter ::= 'm'
letter ::= 'n'
letter ::= 'o'
letter ::= 'p'
letter ::= 'q'
letter ::= 'r'
letter ::= 's'
letter ::= 't'
letter ::= 'u'
letter ::= 'v'
letter ::= 'w'
letter ::= 'x'
letter ::= 'y'
letter ::= 'z'
letter ::= 'A'
letter ::= 'B'
letter ::= 'C'
letter ::= 'D'
letter ::= 'E'
letter ::= 'F'
letter ::= 'G'
letter ::= 'H'
letter ::= 'I'
letter ::= 'J'
letter ::= 'K'
letter ::= 'L'
letter ::= 'M'
letter ::= 'N'
letter ::= 'O'
letter ::= 'P'
letter ::= 'Q'
letter ::= 'R'
letter ::= 'S'
letter ::= 'T'
letter ::= 'U'
letter ::= 'V'
letter ::= 'W'
letter ::= 'X'
letter ::= 'Y'
letter ::= 'Z'

digit ::= '0'
digit ::= '1'
digit ::= '2'
digit ::= '3'
digit ::= '4'
digit ::= '5'
digit ::= '6'
digit ::= '7'
digit ::= '8'
digit ::= '9' 

logical_value ::= 'true'
logical_value ::= 'false'

delimiter ::= operator
delimiter ::= separator
delimiter ::= bracket
delimiter ::= declarator
delimiter ::= specificator

operator ::= arithmetic_operator
operator ::= relational_operator
operator ::= logical_operator
operator ::= sequential_operator

arithmetic_operator ::= '+'
arithmetic_operator ::= '-'
arithmetic_operator ::= '×'
arithmetic_operator ::= '/'
arithmetic_operator ::= '÷'
arithmetic_operator ::= '↑'

relational_operator ::= '<'
relational_operator ::= '≤'
relational_operator ::= '='
relational_operator ::= '≥'
relational_operator ::= '>'
relational_operator ::= '≠'

logical_operator ::= '≡'
logical_operator ::= 'ↄ'
logical_operator ::= '∨'
logical_operator ::= '∧'
logical_operator ::= '¬'

sequential_operator ::= 'go to'
sequential_operator ::= 'if'
sequential_operator ::= 'then'
sequential_operator ::= 'else'
sequential_operator ::= 'for'
sequential_operator ::= 'do'

separator ::= ','
separator ::= '.'
separator ::= '10'
separator ::= ':'
separator ::= ';'
separator ::= ':='
separator ::= '␣'
separator ::= 'step'
separator ::= 'until'
separator ::= 'while'
separator ::= 'comment'

bracket ::= '('
bracket ::= ')'
bracket ::= '['
bracket ::= ']'
bracket ::= '`'
bracket ::= '\''
bracket ::= 'begin'
bracket ::= 'end'

declarator ::= 'own'
declarator ::= 'Boolean'
declarator ::= 'integer'
declarator ::= 'real'
declarator ::= 'array'
declarator ::= 'switch'
declarator ::= 'procedure'

specificator ::= 'string'
specificator ::= 'label'
specificator ::= 'value'

identifier ::= letter
identifier ::= identifier letter
identifier ::= identifier digit

unsigned_integer ::= digit
unsigned_integer ::= unsigned_integer digit

integer ::= unsigned_integer
integer ::= '+' unsigned_integer
integer ::= '-' unsigned_integer

decimal_fraction ::= '.' unsigned_integer

exponential_part ::= '10' integer

decimal_number ::= unsigned_integer
decimal_number ::= decimal_fraction
decimal_number ::= unsigned_integer decimal_fraction

unsigned_number ::= decimal_number 
unsigned_number ::= exponential_part
unsigned_number ::= decimal_number exponential_part

number ::= unsigned_number
number ::= '+' unsigned_number
number ::= '-' unsigned_number

proper_string ::= any_sequence_of_characters_not_containing_apostrophe
proper_string ::= empty

open_string ::= proper_string
open_string ::= proper_string closed_string open_string

closed_string ::= '`'open_string'\''

string ::= closed_string
string ::= closed_string string

expression ::= arithmetic_expression
expression ::= Boolean_expression
expression ::= designational_expression
        
variable_identifier ::= identifier

simple_variable ::= variable_identifier

subscript_expression ::= arithmetic_expression

subscript_list ::= subscript_expression
subscript_list ::= subscript_list ',' subscript_expression

array_identifier ::= identifier

subscripted_value ::= array_identifier'['subscripted_list']'

variable ::= simple_variable
variable ::= subscripted_variable

procedure_identifier ::= identifier

actual_parameter ::= string
actual_parameter ::= expression
actual_parameter ::= array_identifier
actual_parameter ::= switch_identifier
actual_parameter ::= procedure_identifier

letter_string ::= letter
letter_string ::= letter_string letter

parameter_delimiter ::= ','
parameter_delimiter ::= ')' letter_string ':' '('

actual_parameter_list ::= actual_parameter
actual_parameter_list ::= actual_parameter_list parameter_delimiter actual_parameter

actual_parameter_part ::= empty
actual_parameter_part ::= '(' actual_parameter_list ')'

function_designator ::= procedure_identifier actual_parameter_part

adding_operator ::= '+'
adding_operator ::= '-'

multiplying_operator ::= '×'
multiplying_operator ::= '/'
multiplying_operator ::= '÷'

primary ::= unsigned_number
primary ::= variable
primary ::= function_designator
primary ::= '(' arithmetic_expression ')'

factor ::= primary
factor ::= factor '↑' primary

term ::= factor
term ::= term multiplying_operator factor

simple_arithmetic_expression ::= term
simple_arithmetic_expression ::= adding_operator term
simple_arithmetic_expression ::= simple_arithmetic_expression adding_operator term

if_clause ::= 'if' Boolean_expression 'then'

arithmetic_expression ::= simple_arithmetic_expression
arithmetic_expression ::= if_clause simple_arithmetic_expression 'else' arithmetic_expression

relational_operator ::= '<'
relational_operator ::= '≤'
relational_operator ::= '='
relational_operator ::= '≥'
relational_operator ::= '>'
relational_operator ::= '≠'

relation ::= simple_arithmetic_expression
relation ::= relational_operator simple_arithmetic_expression

Boolean_primary ::= logical_value
Boolean_primary ::= variable
Boolean_primary ::= function_designator
Boolean_primary ::= relation
Boolean_primary ::= '(' Boolean_expression ')'

Boolean_secondary ::= Boolean_primary
Boolean_secondary ::= '¬' Boolean_primary

Boolean_factor ::= Boolean_secondary
Boolean_factor ::= Boolean_factor '∧' Boolean_secondary

Boolean_term ::= Boolean_factor
Boolean_term ::= Boolean_term '∨' Boolean_factor

implication ::= Boolean_term
implication ::= implication 'ↄ' Boolean_term

simple_Boolean ::= implication
simple_Boolean ::= simple_Boolean '≡' implication

Boolean_expression ::= simple_Boolean
Boolean_expression ::= if_clause simple_Boolean 'else' Boolean_expression

label ::= identifier
label ::= unsigned_integer

switch_identifier ::= identifier

switch_designator ::= switch_identifier'['subscript_expression']'

simple_designational_expression ::= label
simple_designational_expression ::= switch_designator
simple_designational_expression ::= '(' designational_expression ')'

designational_expression ::= simple_designational_expression
designational_expression ::= if_clause simple_designational_expression 'else' designational_expression

unlabelled_basic_statement ::= assignment_statement
unlabelled_basic_statement ::= go_to_statement
unlabelled_basic_statement ::= dummy_statement
unlabelled_basic_statement ::= procedure_statement

basic_statement ::= unlabelled_basic_statement
basic_statement ::= label':' basic_statement

unconditional_statement ::= basic_statement
unconditional_statement ::= compound_statement
unconditional_statement ::= block

statement ::= unconditional_statement
statement ::= conditional_statement
statement ::= for_statement

compound_tail ::= statement 'end'
compound_tail ::= statement ';' compound_tail

block_head ::= 'begin' declaration
block_head ::= block_head ';' declaration

unlabelled_compound ::= 'begin' compound_tail

unlabelled_block ::= block_head ';' compound_tail

compound_statement ::= unlabelled_compound
compound_statement ::= label':' compound_statement

block ::= unlabelled_block
block ::= label':' block

program ::= block
program ::= compound_statement

destination ::= variable
destination ::= procedure_identifier

left_part ::= destination ':='

left_part_list ::= left_part
left_part_list ::= left_part_list left_part

assignment_statement ::= left_part_list arithmetic_expression
assignment_statement ::= left_part_list Boolean_expression

go_to_statement ::= 'go to' designational_expression

dummy_statement ::= empty

if_clause ::= 'if' Boolean_expression 'then'

unconditional_statement ::= basic_statement
unconditional_statement ::= compound_statement
unconditional_statement ::= block

if_statement ::= if_clause unconditional_statement

conditional_statement ::= if_statement
conditional_statement ::= if_statement 'else' statement
conditional_statement ::= if_clause for_statement
conditional_statement ::= block':' conditional_statement

for_list_element ::= arithmetic_expression
for_list_element ::= arithmetic_expression 'step' arithmetic_expression 'until' arithmetic_expression
for_list_element ::= arithmetic_expression 'while' Boolean_expression

for_list ::= for_list_element
for_list ::= for_list ',' for_list_element

for_clause ::= 'for' variable ':=' for_list 'do'

for_statement ::= for_clause statement
for_statement ::= label':' for_statement

actual_parameter ::= string
actual_parameter ::= expression
actual_parameter ::= array_identifier
actual_parameter ::= switch_identifier
actual_parameter ::= procedure_identifier

letter_string ::= letter
letter_string ::= letter_string letter

parameter_delimiter ::= ','
parameter_delimiter ::= ')' letter_string ':' '('

actual_parameter_list ::= actual_parameter
actual_parameter_list ::= actual_parameter_list parameter_delimiter actual_parameter

actual_parameter_part ::= empty
actual_parameter_part ::= '(' actual_parameter_list ')'

procedure_statement ::= procedure_identifier actual_parameter_part

declaration ::= type_declaration
declaration ::= array_declaration
declaration ::= switch_declaration
declaration ::= procedure_declaration

type_list ::= simple_variable
type_list ::= simple_variable ',' type_list

type ::= 'real'
type ::= 'integer'
type ::= 'Boolean'

local_or_own ::= empty
local_or_own ::= 'own'

type_declaration ::= local_or_own type type_list

lower_bound ::= arithmetic_expression

upper_bound ::= arithmetic_expression

bound_pair ::= lower_bound ':' upper_bound

bound_pair_list ::= bound_pair
bound_pair_list ::= bound_pair_list ',' bound_pair

array_segment ::= array_identifier '[' bound_pair_list ']'
array_segment ::= array_identifier ',' array_segment

array_list ::= array_segment
array_list ::= array_list ',' array_segment

array_declarer ::= type 'array'
array_declarer ::= 'array'

array_declaration ::= local_or_own array_declarer array_list

switch_list ::= designational_expression
switch_list ::= switch_list ',' designational_expression

switch_declaration ::= 'switch' switch_identifier ':=' switch_list

formal_parameter ::= identifier 

formal_parameter_list ::= formal_parameter
formal_parameter_list ::= formal_parameter_list parameter_delimiter formal_parameter

formal_parameter_part ::= empty
formal_parameter_part ::= '(' formal_parameter_list ')'

identifier_list ::= identifier
identifier_list ::= identifier_list ',' identifier

value_part ::= 'value' identifier_list ';'
value_part ::= empty

specifier ::= 'string'
specifier ::= type
specifier ::= array_declarer
specifier ::= 'label'
specifier ::= 'switch'
specifier ::= 'procedure'
specifier ::= type 'procedure'

specification_part ::= empty
specification_part ::= specifier identifier_list ';'
specification_part ::= specification_part specifier identifier_list

procedure_heading ::= procedure_identifier formal_parameter_part ';' value_part specification_part

procedure_body ::= statement
procedure_body ::= code

procedure_declaration ::= 'procedure' procedure_heading procedure_body
procedure_declaration ::= type 'procedure' procedure_heading procedure_body
grammar-language.txt · Last modified: 2013/05/28 14:41 by Sergej Chodarev

Page Tools