Skip to content

Instantly share code, notes, and snippets.

@tj
Created May 11, 2009 17:20
Show Gist options
  • Select an option

  • Save tj/110055 to your computer and use it in GitHub Desktop.

Select an option

Save tj/110055 to your computer and use it in GitHub Desktop.
%{
#include "yamp.h"
#define YYSTYPE char *
static yaParser *parser;
%}
main = Comment
| Doctype
| Element
| Newline
| s
| < (!EOF .)+ > { YA_PARSE_ERROR }
Attribute = name:Id
- '=' -
val:String
Attributes = Attribute (s Attribute)*
Element = '<' - name:Id { parser->current = yaElement_new(name) }
(s Attributes)? - '/>'
| '<' - name:Id { parser->current = yaElement_new(name); parser->parent = parser->current; if (!parser->root) parser->root = parser->current }
(s Attributes)? - '>'
( s
| Cdata
| Comment
| t:Literal { parser->current->text = t }
| Element { parser->current->parent = parser->parent }
)*
'</' - Id - '>'
Comment = '<!--' (!'-->' .)* '-->'
| '<?' (!'?>' .)* '?>' # TODO: capture as meta
Cdata = '<![DATA[' < (!']]>' .)* > ']]>' # TODO: fix ...
Doctype = '<!DOCTYPE' (!'>' .)* '>'
Literal = < (!'<' .)+ > { $$ = yytext } # TODO: try removing these again
String = '"' < (!'"' .)* > '"' { $$ = yytext }
Id = < ([a-zA-Z0-9:_] | '-')+ > { $$ = yytext }
Newline = ('\r\n' | '\n' | '\r') { parser->lineno++ }
EOF = !.
s = [ \t]+
- = [ \t]*
%%
yaParser *
yaParser_parse(char *input) {
parser = yaParser_new(input);
while (YYPARSE());
return parser;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment