# See https://www.reddit.com/r/ProgrammingLanguages/comments/1adxfhk/comment/kk72mik/
constant \source =
'
class foo:
field bar = 42
method baz:
some code
goes here
enum qux
';
grammar some-language {
token TOP { \s* <classDecl>* %% \s* }
token classDecl { <normalDecl> | <enumDecl> }
token normalDecl { 'class' \s+ <ident> \s* ':' \n [ <field> | <method> ]* }
token field { \s* 'field' \s+ <ident> \s* '=' \s* \d+ \n }
token method { \s* 'method' \s+ <ident> \s* ':' \n [ \h* \S+ \V* \n ]* }
token enumDecl { \s* 'enum' \s+ <ident> }
}
class some-language-ast {
method field ($cst) { $cst.make: "field-name: $cst<ident>" }
method enumDecl ($cst) { $cst.make: "enum-name: $cst<ident>" }
}
given some-language .parse: source, actions => some-language-ast {
say .<classDecl>[1]<enumDecl>\ .ast; # enum-name: qux
say .<classDecl>[0]<normalDecl><field>[0].ast; # field-name: bar
}