新作言語のEBNFを書いていくスレ
文法はWikiを見てね↓
https://ja.wikipedia.org/wiki/EBNF
↓は四則演算の実装
program = expr ;
expr = term , [ add sub op , term ] ;
term = factor , [ mul div op , factor ] ;
factor = number | "(" expr ")" ;
number = [ "-" ] , digit , [ { digit } ] ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
add sub op = "+" | "-" ;
mul div op = "*" | "/" ; WikipediaをWikiという人間は信用されまふぇんよ?(^^ if statement = "if" , expr . " <Exp> ::= <Const> | <Var> | <Form>
<Form> ::= <If> | <Lambda> | <Apply> | <Let> | <Letrec>
<If> ::= "[" IF "," <Exp> "," <Exp> "," <Exp> "]"
<Lambda> ::= "[" LAMBDA "," "[" <Var1> "," ... "," <VarN> "]" "," <Exp> "]" /* N >= 1 */
<Apply> ::= "[" <Exp1> "," ... "," <ExpN> "]" /* N >= 2 */
<Let> ::= "[" LET "," <Exp> "," <Bind1> "," ... "," <BindN> "]" /* N >= 0 */
<Bind> ::= "[" <Var> "," <Exp> "]"
<Letrec> ::= "[" LETREC "," <Exp> "," "[" <RecBind1> "," ... "," <RecBindN> "]" "]" /* N >= 0 */
<RecBind> ::= "[" <Var> "|" <Lambda> "]" >>5 の例として、階乗(FACT)と最大公約数(GCD)
[LETREC, [@fact, 4],
[@fact, LAMBDA, [@x],
[IF, [LE, @x, 1],
1,
[MUL, @x, [@fact, [SUB, @x, 1]]]]]] ;
[LETREC, [@gcd, 16, 28],
[@gcd, LAMBDA, [@a, @b],
[IF, [EQ, @b, 0],
@a,
[@gcd, @b, [MOD, @a, @b]]]]]