summaryrefslogtreecommitdiff
path: root/scalatexApi/src/main/scala/scalaparser/syntax
diff options
context:
space:
mode:
Diffstat (limited to 'scalatexApi/src/main/scala/scalaparser/syntax')
-rw-r--r--scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala15
-rw-r--r--scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala5
-rw-r--r--scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala4
3 files changed, 21 insertions, 3 deletions
diff --git a/scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala b/scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala
index bd142a1..157b0bb 100644
--- a/scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala
+++ b/scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala
@@ -33,4 +33,19 @@ trait Basic { self: Parser =>
def Lower = rule { "a" - "z" | "$" | "_" | CharPredicate.from(_.isLower) }
def Upper = rule { "A" - "Z" | CharPredicate.from(_.isUpper) }
}
+ /**
+ * Most keywords don't just require the correct characters to match,
+ * they have to ensure that subsequent characters *don't* match in
+ * order for it to be a keyword. This enforces that rule for key-words
+ * (W) and key-operators (O) which have different non-match criteria.
+ */
+ object Key {
+ def W(s: String) = rule {
+ str(s) ~ !(Basic.Letter | Basic.Digit)
+ }
+
+ def O(s: String) = rule {
+ str(s) ~ !Basic.OperatorChar
+ }
+ }
}
diff --git a/scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala b/scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala
index e5d3934..2590dfa 100644
--- a/scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala
+++ b/scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala
@@ -13,7 +13,10 @@ trait Identifiers { self: Parser with Basic =>
}
def PlainId = rule { Upper ~ IdRest | VarId | !(Keywords ~ (WhitespaceChar | Newline | "//" | "/*")) ~ Operator }
def Id = rule { PlainId | ("`" ~ oneOrMore(noneOf("`")) ~ "`") }
- def IdRest = rule { zeroOrMore(Letter | Digit) ~ optional("_" ~ Operator) }
+ def IdRest = rule {
+ zeroOrMore(zeroOrMore("_") ~ oneOrMore(!"_" ~ Letter | Digit)) ~
+ optional(oneOrMore("_") ~ Operator)
+ }
def AlphabetKeywords = rule {
diff --git a/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala b/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
index 2289d9c..3222254 100644
--- a/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
+++ b/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
@@ -17,7 +17,7 @@ trait Literals { self: Parser with Basic with Identifiers =>
def IntegerLiteral = rule { capture((DecimalNumeral | HexNumeral) ~ optional(anyOf("Ll"))) }
- def BooleanLiteral = rule { capture("true" | "false") ~ !Letter }
+ def BooleanLiteral = rule { capture(Key.W("true") | Key.W("false")) }
def MultilineComment: Rule0 = rule { "/*" ~ zeroOrMore(MultilineComment | !"*/" ~ ANY) ~ "*/" }
def Comment: Rule0 = rule {
@@ -31,7 +31,7 @@ trait Literals { self: Parser with Basic with Identifiers =>
CharacterLiteral |
StringLiteral |
SymbolLiteral |
- capture("null")
+ capture(Key.W("null") ~ !(Basic.Letter | Basic.Digit))
}