Parse EBNF: Difference between revisions

(Added Julia translation)
Line 1,835:
It is implemented and exercised using the flavor of EBNF and test cases specified on the [[Parse EBNF/Tests|test page]].
 
<lang perl6># A Raku grammar to parse EBNF
# A Raku grammar EBNFto {parse EBNF
grammar EBNF {
rule TOP { ^ <title>? '{' [ <production> ]+ '}' <comment>? $ }
rule production { <name> '=' <expression> <[.;]> }
Line 1,850 ⟶ 1,851:
token comment { <literal> }
token name { <identifier> <?before \h* '='> }
}
 
class EBNF::Actions {
method TOP($/) {
say "Syntax Tree:\n", $/; # Dump the syntax tree to STDOUT
Line 1,876 ⟶ 1,877:
method optional($/) { make $<expression>.ast }
method group($/) { make $<expression>.ast }
}
 
# An array of test cases
my @tests = (
{
ebnf =>
Line 1,903 ⟶ 1,904:
term = factor { times factor } .
factor = number | '(' expr ')' .
 
plus = "+" | "-" .
times = "*" | "/" .
 
number = digit { digit } .
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" .
Line 1,936 ⟶ 1,937:
teststrings => ['foobar']
}
);
 
# Test the parser.
my $i = 1;
for @tests -> $test {
unless EBNF.parse($test<ebnf>) {
say "Parsing EBNF grammar:\n";
Line 1,971 ⟶ 1,972:
say '*' x 79, "\n";
unlink $fn;
}
}</lang>
 
Output:
9

edits