diff options
Diffstat (limited to 'scalatexApi/src/main/scala/scalaparser/syntax')
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)) } |