Parse EBNF: Difference between revisions
m
syntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 16:
<br>
A more or less faithful translation except that indices are 0-based rather than 1-based and so 1 less than in the Phix results.
<
import (
Line 420:
fmt.Println()
}
}</
{{out}}
Line 503:
We use Parsec to generate Parsec.
<
import Control.Monad
import Data.Maybe
Line 675:
lc c = char c <* ws
ws = many $ oneOf " \n\t"</
=={{header|Julia}}==
Line 683:
Tested with Julia v1.7.2
<
struct Grammar
regex::Regex
Line 835:
end
</syntaxhighlight>
=={{header|Modula-2}}==
<
FROM ASCII IMPORT EOL;
Line 927:
Tabulate (T0);
Tabulate (T1);
END EBNF.</
And the source for the EBNF scanner. I hope you like nested procedures.
<
FROM ASCII IMPORT LF;
Line 1,096:
Ino := 0;
ch := ' '
END EBNFScanner.</
=={{header|Perl}}==
<
use strict; # http://www.rosettacode.org/wiki/Parse_EBNF
Line 1,273:
----------------------------------------------------------------------
{ foo = bar . } "undefined production check"
----------------------------------------------------------------------</
{{out}}
<pre>
Line 1,387:
=={{header|Phix}}==
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">src</span>
Line 1,704:
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</
In real use, I would be tempted to use numeric literals rather than string tags in such structures, but the latter certainly make things ten times easier to debug, plus I got an instantly legible syntax tree dump (the bit just after "===>" below) practically for free.
{{out}}
Line 1,771:
=={{header|PicoLisp}}==
<
"expr : term ( ( PLUS | MINUS ) term )* ;"
"term : factor ( ( MULT | DIV ) factor )* ;"
Line 1,780:
(unless (and (match '(@S : @E ;) (str E)) (not (cdr @S)))
(quit "Invalid EBNF" E) )
(put (car @S) 'ebnf @E) ) )</
<
(cond
((asoq Pat '((PLUS . +) (MINUS . -) (MULT . *) (DIV . /)))
Line 1,823:
(let *Lst (str Str "")
(catch NIL
(parseLst (get 'expr 'ebnf)) ) ) )</
Output:
<pre>: (parseEbnf "1 + 2 * -3 / 7 - 3 * 4")
Line 1,835:
It is implemented and exercised using the flavor of EBNF and test cases specified on the [[Parse EBNF/Tests|test page]].
<syntaxhighlight lang="raku" line>
# A Raku grammar to parse EBNF
grammar EBNF {
Line 1,973:
unlink $fn;
}
</syntaxhighlight>
Output:
Line 2,244:
{{in progress|lang=Ruby|day=12|month=May|year=2011}}
{{incomplete|Ruby|The tokenizer is here, but the parser is very incomplete.}}
<
# The tokenizer splits the input into Tokens like "identifier",
# ":", ")*" and so on. This design uses a StringScanner on each line of
Line 2,382:
parse
end
</syntaxhighlight>
=={{header|Tcl}}==
Line 2,388:
Demonstration lexer and parser. Note that this parser supports parenthesized expressions, making the grammar recursive.
<
# Utilities to make the coroutine easier to use
Line 2,522:
}
throw SYNTAX "\"$payload\" at position $index"
}</
<
puts [parse "1 - 2 - -3 * 4 + 5"]
puts [parse "1 - 2 - -3 * (4 + 5)"]</
Output:
<pre>
Line 2,540:
{{libheader|Wren-seq}}
Translated via the Go entry.
<
import "/trait" for Stepped
import "/str" for Char
Line 2,907:
System.print()
i = i + 1
}</
{{out}}
|