public
Description: An implementation of markdown in C, using a PEG grammar
Clone URL: git://github.com/jgm/peg-markdown.git
Search Repo:
100644 35 lines (26 sloc) 0.861 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Grammar
 
Stmt  <- SPACE Expr EOL      { printf("%d\n", pop()); }
   / (!EOL .)* EOL      { printf("error\n"); }
 
Expr  <- ID { var= yytext[0] } ASSIGN Sum  { vars[var - 'a']= top(); }
   / Sum
 
Sum  <- Product ( PLUS Product    { int r= pop(), l= pop(); push(l + r); }
     / MINUS Product    { int r= pop(), l= pop(); push(l - r); }
     )*
 
Product  <- Value ( TIMES Value      { int r= pop(), l= pop(); push(l * r); }
                 / DIVIDE Value      { int r= pop(), l= pop(); push(l / r); }
     )*
 
Value  <- NUMBER        { push(atoi(yytext)); }
   / < ID > !ASSIGN      { push(vars[yytext[0] - 'a']); }
   / OPEN Expr CLOSE
 
# Lexemes
 
NUMBER  <- < [0-9]+ >  SPACE
ID  <- < [a-z] >  SPACE
ASSIGN  <- '='    SPACE
PLUS  <- '+'    SPACE
MINUS  <- '-'    SPACE
TIMES  <- '*'    SPACE
DIVIDE  <- '/'    SPACE
OPEN  <- '('    SPACE
CLOSE  <- ')'    SPACE
 
SPACE  <- [ \t]*
EOL  <- '\n' / '\r\n' / '\r' / ';'