{{ // global (one-time) initializer import { scriptFile } from "./ScriptFile"; import { numberValue } from "./ScriptValue"; import { versionStatement } from "./TopLevelStatement"; }} { // per-parse initializer } // peggy-loader:startRule ScriptFile ScriptFile = statements:TopLevelStatementList { return scriptFile(statements); } NewLine "newline" = "\n" { return null; } WhiteSpace "whitespace" = [ \r\v\t]+ { return null; } LineComment "line comment" = "//" [^\n]* { return null; } BlockCommentTail = "*/" / ( "*" !"/" [^*]* BlockCommentTail ) { return null; } BlockComment "block comment" = "/*" [^*]* BlockCommentTail { return null; } IntegerLiteral "integer literal" = digits:$[0-9]+ { return numberValue(digits); } NonToken = (LineComment / BlockComment / WhiteSpace) { return null; } _ = (NonToken+) { return null; } StatementEnd = _? NewLine { return null; } VersionStatement "version statement" = "script" _ "version" _ version:IntegerLiteral { return versionStatement(version.value); } TopLevelStatement "top-level statement" = VersionStatement TopLevelStatementList = (StatementEnd* _? head:TopLevelStatement tail:(StatementEnd+ _? @TopLevelStatement)* StatementEnd* _? { return [head, ...tail]; }) / (StatementEnd* _? { return []; })