{{ // global (one-time) initializer import { scriptFile } from "./ScriptFile"; import { versionStatement } from "./TopLevelStatement"; import { battlerDeclaration, battlerAttributeType, battlerAttribute } from "./BattlerStatement"; import { numberValue, identifier } from "./ScriptValue"; }} { // per-parse initializer } // ********************************************************************************************************************* // * Entry Points // ********************************************************************************************************************* ScriptFile = statements:TopLevelStatementList { return scriptFile(statements); } // peggy-loader:startRule ScriptFile TopLevelExpression = _? @Expression FileEnd // peggy-loader:startRule TopLevelExpression // ********************************************************************************************************************* // * Top-level Statements // ********************************************************************************************************************* TopLevelStatementList = (__ head:TopLevelStatement tail:(StatementEnd __ @TopLevelStatement)* FileEnd { return [head, ...tail]; }) / (FileEnd { return []; }) TopLevelStatement "top-level statement" = VersionStatement / BattlerDeclaration VersionStatement "version statement" = "script" _ "version" _ version:WholeNumberLiteral { return versionStatement(version.value); } // ********************************************************************************************************************* // * Battler Declaration + Statements // ********************************************************************************************************************* BattlerDeclaration "battler declaration" = "battler" _ id:Identifier contents:(StatementEnd __ @BattlerStatement)* StatementEnd __ "end" _ "battler" { return battlerDeclaration(id.value, contents) } BattlerStatement = BattlerAttribute BattlerAttribute = attr:BattlerAttributeType _ expr:Expression { return battlerAttribute(attr, expr); } BattlerAttributeType "attribute name" = attr:("health" / "confidence" / "stamina") { return battlerAttributeType(attr); } // ********************************************************************************************************************* // * Expressions // ********************************************************************************************************************* Expression "expression" = WholeNumberLiteral / Identifier Identifier "identifier" = id:$([a-zA-Z_$] [a-zA-Z_$0-9]*) { return identifier(id); } WholeNumberLiteral "whole number literal" = digits:$[0-9]+ { return numberValue(digits); } // ********************************************************************************************************************* // * Whitespace and Comments // ********************************************************************************************************************* FileEnd = __ LineComment? __ = StatementEnd* _? { return null; } StatementEnd = _? LineComment? NewLine { return null; } _ = (NonToken+) { return null; } NonToken = (BlockComment / WhiteSpace) { return null; } LineComment "line comment" = "//" [^\n]* { return null; } BlockComment "block comment" = "/*" [^*]* BlockCommentTail { return null; } BlockCommentTail = "*/" / ( "*" !"/" [^*]* BlockCommentTail ) { return null; } WhiteSpace "whitespace" = [ \r\v\t]+ { return null; } NewLine "newline" = "\n" { return null; }