aboutsummaryrefslogtreecommitdiff
path: root/src/syntax.grammar
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2026-01-04 22:15:20 -0800
committerElizabeth Hunt <me@liz.coffee>2026-01-04 22:15:20 -0800
commit686c6f90d7a3c2bc0f8b89619c5d91ee8fb320e4 (patch)
tree4813432a71edb425fe453316e3e07f637690a0b1 /src/syntax.grammar
downloadcodemirror-lang-tabloid-686c6f90d7a3c2bc0f8b89619c5d91ee8fb320e4.tar.gz
codemirror-lang-tabloid-686c6f90d7a3c2bc0f8b89619c5d91ee8fb320e4.zip
Add tabloid language support
Diffstat (limited to 'src/syntax.grammar')
-rw-r--r--src/syntax.grammar136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/syntax.grammar b/src/syntax.grammar
new file mode 100644
index 0000000..bffd9c4
--- /dev/null
+++ b/src/syntax.grammar
@@ -0,0 +1,136 @@
+@top Program { statement* ProgramEnd }
+
+@precedence {
+ else,
+ call,
+ times @left,
+ plus @left,
+ compare @left,
+ and @left,
+ or @left
+}
+
+statement {
+ FunctionDecl |
+ Assignment |
+ IfStatement |
+ ReturnStatement |
+ Block |
+ ExprStatement
+}
+
+ExprStatement { expression }
+
+FunctionDecl {
+ discoverHowTo Identifier (with ArgumentList)? statement
+}
+
+ArgumentList { Identifier ("," Identifier)* }
+
+Assignment {
+ expertsClaim Identifier toBe expression
+}
+
+IfStatement {
+ whatIf expression statement (!else liesBang statement)?
+}
+
+ReturnStatement {
+ shockingDevelopment expression
+}
+
+PrintStatement {
+ youWontWantToMiss expression
+}
+
+InputStatement {
+ latestNewsOn expression
+}
+
+Block {
+ rumorHasIt statement* endOfStory
+}
+
+ParenBlock {
+ "(" statement* ")"
+}
+
+FunctionCall {
+ Identifier !call of ArgumentExpression ("," ArgumentExpression)*
+}
+
+ArgumentExpression { expression }
+
+expression {
+ NumberLiteral |
+ StringLiteral |
+ BooleanLiteral |
+ Identifier |
+ FunctionCall |
+ ParenBlock |
+ PrintStatement |
+ InputStatement |
+ BinaryExpression
+}
+
+BinaryExpression {
+ expression !times (times | dividedBy | modulo) expression |
+ expression !plus (plus | minus) expression |
+ expression !compare (isActually | beats | smallerThan) expression |
+ expression !and and expression |
+ expression !or or expression
+}
+
+ProgramEnd {
+ pleaseLikeAndSubscribe
+}
+
+@skip { space | newline }
+
+@tokens {
+ space { $[ \t]+ }
+ newline { $[\n\r] }
+
+ identifierChar { $[A-Z_\-] | $[0-9] | "'" }
+
+ word { ($[A-Z_\-] | "'") identifierChar* }
+
+ @precedence { StringLiteral, NumberLiteral, BooleanLiteral, discoverHowTo, expertsClaim, latestNewsOn, pleaseLikeAndSubscribe, rumorHasIt, shockingDevelopment, whatIf, youWontWantToMiss, toBe, with, of, endOfStory, liesBang, isActually, dividedBy, smallerThan, and, or, plus, minus, times, modulo, beats, Identifier }
+
+ Identifier { word }
+
+ NumberLiteral { $[0-9]+ ("." $[0-9]+)? }
+
+ StringLiteral { '"' (!["\\] | "\\" _)* '"' | "'" (!['\\] | "\\" _)* "'" }
+
+ BooleanLiteral { "TOTALLY" space "RIGHT" | "COMPLETELY" space "WRONG" }
+
+ discoverHowTo { "DISCOVER" space "HOW" space "TO" }
+ with { "WITH" }
+ of { "OF" }
+ expertsClaim { "EXPERTS" space "CLAIM" }
+ toBe { "TO" space "BE" }
+ rumorHasIt { "RUMOR" space "HAS" space "IT" }
+ whatIf { "WHAT" space "IF" }
+ liesBang { "LIES!" }
+ endOfStory { "END" space "OF" space "STORY" }
+ shockingDevelopment { "SHOCKING" space "DEVELOPMENT" }
+ youWontWantToMiss { "YOU" space "WON'T" space "WANT" space "TO" space "MISS" }
+ latestNewsOn { "LATEST" space "NEWS" space "ON" }
+ pleaseLikeAndSubscribe { "PLEASE" space "LIKE" space "AND" space "SUBSCRIBE" }
+
+ isActually { "IS" space "ACTUALLY" }
+ and { "AND" }
+ or { "OR" }
+ plus { "PLUS" }
+ minus { "MINUS" }
+ times { "TIMES" }
+ dividedBy { "DIVIDED" space "BY" }
+ modulo { "MODULO" }
+ beats { "BEATS" }
+ smallerThan { "SMALLER" space "THAN" }
+
+ "(" ")" ","
+}
+
+@detectDelim