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.
 
vore-rpg/src/scripting/NomScript.peggy

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; }