You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
3.4 KiB
60 lines
3.4 KiB
{{
|
|
// 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; } |