WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 2151bca

Browse files
committed
Add backslash
1 parent 1887a09 commit 2151bca

File tree

14 files changed

+1526
-5
lines changed

14 files changed

+1526
-5
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** AssertKind is a kind of backslash assertion. */
4+
sealed abstract class AssertKind extends Product with Serializable
5+
6+
object AssertKind {
7+
8+
/** Boundary is a boundary assertion (e.g. `\b`). */
9+
final case class Boundary(modifier: Option[BoundaryModifier]) extends AssertKind
10+
11+
/** NonBoundary is a non-boundary assertion (e.g. `\B`). */
12+
final case class NonBoundary(modifier: Option[BoundaryModifier]) extends AssertKind
13+
14+
/** Cut is a cut assertion (e.g. `\K`). */
15+
case object Cut extends AssertKind
16+
17+
/** Sticky is a sticky assertion (e.g. `\G`). */
18+
case object Sticky extends AssertKind
19+
20+
/** Begin is a begin assertion (e.g. `\A`). */
21+
case object Begin extends AssertKind
22+
23+
/** LowerEnd is an end assertion (e.g. `\z`). */
24+
case object LowerEnd extends AssertKind
25+
26+
/** UpperEnd is an end assertion (e.g. `\Z`). */
27+
case object UpperEnd extends AssertKind
28+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** BackReferenceStyle is a style for back-reference escape. */
4+
sealed abstract class BackReferenceStyle extends Product with Serializable
5+
6+
object BackReferenceStyle {
7+
8+
/** BareBackReference is `\1` back-reference escape style. */
9+
case object BareBackReference extends BackReferenceStyle
10+
11+
/** GBackReference is `\g` back-reference escape style. */
12+
final case class GBackReference(style: NameStyle) extends BackReferenceStyle
13+
14+
/** KBackReference is `\k` back-reference escape style. */
15+
final case class KBackReference(style: NameStyle) extends BackReferenceStyle
16+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** BackslashKind is a kind of backslash node. */
4+
sealed abstract class BackslashKind extends Product with Serializable
5+
6+
object BackslashKind {
7+
8+
/** Unknown is an unknown backslash. */
9+
final case class Unknown(value: Int) extends BackslashKind
10+
11+
/** EscapeClass is a backslash escape class. */
12+
final case class EscapeClass(kind: EscapeClassKind) extends BackslashKind
13+
14+
/** EscapeBackReference is a back-reference escape. */
15+
final case class EscapeBackReference(style: BackReferenceStyle, ref: Reference) extends BackslashKind
16+
17+
/** EscapeCall is `\g<x>` escape. */
18+
final case class EscapeCall(style: NameStyle, ref: Reference.BaseReference) extends BackslashKind
19+
20+
/** Escape is a backslash escape. */
21+
final case class Escape(style: EscapeStyle, value: Int) extends BackslashKind
22+
23+
/** Assert is an assertion backslash. */
24+
final case class Assert(kind: AssertKind) extends BackslashKind
25+
26+
/** CaseCommand is a case command backslash. */
27+
final case class CaseCommand(kind: CaseCommandKind) extends BackslashKind
28+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** BoundaryModifier is a kind of boundary modifier. */
4+
sealed abstract class BoundaryModifier extends Product with Serializable
5+
6+
object BoundaryModifier {
7+
8+
/** GModifier is a modifier of `\b{g}`. */
9+
case object GModifier extends BoundaryModifier
10+
11+
/** GcbModifier is a modifier of `\b{gcb}`. */
12+
case object GcbModifier extends BoundaryModifier
13+
14+
/** LbModifier is a modifier of `\b{lb}`. */
15+
case object LbModifier extends BoundaryModifier
16+
17+
/** SbModifier is a modifier of `\b{sb}`. */
18+
case object SbModifier extends BoundaryModifier
19+
20+
/** WbModifier is a modifier of `\b{wb}`. */
21+
case object WbModifier extends BoundaryModifier
22+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** CaseCommandKind is a kind of case command. */
4+
sealed abstract class CaseCommandKind extends Product with Serializable
5+
6+
object CaseCommandKind {
7+
8+
/** SingleLowerCaseCommand is `\l` case command. */
9+
case object SingleLowerCaseCommand extends CaseCommandKind
10+
11+
/** SingleUpperCaseCommand is `\u` case command. */
12+
case object SingleUpperCaseCommand extends CaseCommandKind
13+
14+
/** LowerCaseCommand is `\L` case command. */
15+
case object LowerCaseCommand extends CaseCommandKind
16+
17+
/** UpperCaseCommand is `\U` case command. */
18+
case object UpperCaseCommand extends CaseCommandKind
19+
20+
/** FoldCaseCommand is `\F` case command. */
21+
case object FoldCaseCommand extends CaseCommandKind
22+
23+
/** QuoteCommand is `\Q` command. */
24+
case object QuoteCommand extends CaseCommandKind
25+
26+
/** EndCaseCommand is `\Q` command. */
27+
case object EndCaseCommand extends CaseCommandKind
28+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** EscapeClassKind is a kind of backslash escape class. */
4+
sealed abstract class EscapeClassKind extends Product with Serializable
5+
6+
object EscapeClassKind {
7+
8+
/** Digit is `\d` class. */
9+
case object Digit extends EscapeClassKind
10+
11+
/** Digit is `\d` class. */
12+
case object NonDigit extends EscapeClassKind
13+
14+
/** Space is `\s` class. */
15+
case object Space extends EscapeClassKind
16+
17+
/** NonSpace is `\S` class. */
18+
case object NonSpace extends EscapeClassKind
19+
20+
/** Word is `\w` class. */
21+
case object Word extends EscapeClassKind
22+
23+
/** NonWord is `\W` class. */
24+
case object NonWord extends EscapeClassKind
25+
26+
/** Horizontal is `\h` class. */
27+
case object Horizontal extends EscapeClassKind
28+
29+
/** NonHorizontal is `\H` class. */
30+
case object NonHorizontal extends EscapeClassKind
31+
32+
/** Vertical is `\v` class. */
33+
case object Vertical extends EscapeClassKind
34+
35+
/** NonVertical is `\V` class. */
36+
case object NonVertical extends EscapeClassKind
37+
38+
/** HexDigit is `\h` class. */
39+
case object HexDigit extends EscapeClassKind
40+
41+
/** NonHexDigit is `\H` class. */
42+
case object NonHexDigit extends EscapeClassKind
43+
44+
/** NonNewline is `\N` class. */
45+
case object NonNewline extends EscapeClassKind
46+
47+
/** GeneralNewline is `\R` class. */
48+
case object GeneralNewline extends EscapeClassKind
49+
50+
/** GraphemeCluster is `\X` class. */
51+
case object GraphemeCluster extends EscapeClassKind
52+
53+
/** UnicodeProperty is `\p{XXX}` class. */
54+
final case class UnicodeProperty(name: String) extends EscapeClassKind
55+
56+
/** UnicodeBareProperty is `\pX` class. */
57+
final case class UnicodeBareProperty(name: String) extends EscapeClassKind
58+
59+
/** UnicodePropertyValue is `\p{XXX=YYY}` class. */
60+
final case class UnicodePropertyValue(name: String, value: String) extends EscapeClassKind
61+
62+
/** NonUnicodeProperty is `\P{XXX}` class. */
63+
final case class NonUnicodeProperty(name: String) extends EscapeClassKind
64+
65+
/** NonUnicodeBareProperty is `\PX` class. */
66+
final case class NonUnicodeBareProperty(name: String) extends EscapeClassKind
67+
68+
/** NonUnicodePropertyValue is `\P{XXX=YYY}` class. */
69+
final case class NonUnicodePropertyValue(name: String, value: String) extends EscapeClassKind
70+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** EscapeStyle is a backslash escape style. */
4+
sealed abstract class EscapeStyle extends Product with Serializable
5+
6+
object EscapeStyle {
7+
8+
/** Single is a single character escape sequence `\n`. */
9+
final case class Single(char: Char) extends EscapeStyle
10+
11+
/** Control is `\cX` escape sequence. */
12+
final case class Control(char: Char) extends EscapeStyle
13+
14+
/** Octal is `\o{010}` escape sequence. */
15+
case object Octal extends EscapeStyle
16+
17+
/** BareOctal is `\010` escape sequence. */
18+
case object BareOctal extends EscapeStyle
19+
20+
/** UnicodeHex4 is `\uXXXX` escape sequence. */
21+
case object UnicodeHex4 extends EscapeStyle
22+
23+
/** UnicodeHex8 is `\UXXXXXXXX` escape sequence. */
24+
case object UnicodeHex8 extends EscapeStyle
25+
26+
/** UnicodeBracket is `\u{XXXX}` escape sequence. */
27+
case object UnicodeBracket extends EscapeStyle
28+
29+
/** Hex2 is `\xXX` escape sequence. */
30+
case object Hex2 extends EscapeStyle
31+
32+
/** Hex1 is `\xX` escape sequence. */
33+
case object Hex1 extends EscapeStyle
34+
35+
/** HexBracket is `\x{XXXX}` escape sequence. */
36+
case object HexBracket extends EscapeStyle
37+
}

modules/resyntax/shared/src/main/scala/codes/quine/labs/resyntax/ast/NodeData.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,15 @@ object NodeData {
5858
/** Group is a group pattern node.
5959
*
6060
* {{{
61-
* Group ::= "(" GroupKind Disjunction ")"
61+
* Group ::=
62+
* "(" GroupKind Disjunction ")"
63+
* Command
64+
* Caret
65+
* Dollar
66+
* Dot
67+
* Backslash
68+
* Class
69+
* Literal
6270
* }}}
6371
*/
6472
final case class Group(kind: GroupKind, node: Node) extends NodeData
@@ -101,6 +109,8 @@ object NodeData {
101109
*/
102110
case object Dot extends NodeData
103111

112+
final case class Backslash(kind: BackslashKind) extends NodeData
113+
104114
/** Literal is a character literal node. */
105115
final case class Literal(value: Int) extends NodeData
106116
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package codes.quine.labs.resyntax.ast
2+
3+
/** Reference is a capture reference for back-reference. */
4+
sealed abstract class Reference extends Product with Serializable
5+
6+
object Reference {
7+
8+
/** BaseReference is a base class for a base reference of leveled reference. */
9+
sealed abstract class BaseReference extends Reference
10+
11+
/** IndexedReference is `\1` style reference. */
12+
final case class IndexedReference(index: Int) extends BaseReference
13+
14+
/** NamedReference is `\k<x>` style reference. */
15+
final case class NamedReference(name: String) extends BaseReference
16+
17+
/** RelativeReference is `\g{-1}` style reference. */
18+
final case class RelativeReference(n: Int) extends BaseReference
19+
20+
/** LeveledReference is `\g{1+1}` style reference. */
21+
final case class LeveledReference(base: BaseReference, level: Int) extends Reference
22+
}

modules/resyntax/shared/src/main/scala/codes/quine/labs/resyntax/parser/CodePointUtil.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ object CodePointUtil {
3030
def isDigit(codePoint: Int): Boolean =
3131
codePoint >= '0' && codePoint <= '9'
3232

33+
def isOctalDigit(codePoint: Int): Boolean =
34+
codePoint >= '0' && codePoint <= '7'
35+
36+
def isHexDigit(codePoint: Int): Boolean =
37+
codePoint >= '0' && codePoint <= '9' || codePoint >= 'a' && codePoint <= 'f' || codePoint >= 'A' && codePoint <= 'F'
38+
3339
def isIDStart(codePoint: Int): Boolean =
3440
codePoint == '_' || codePoint == '$' ||
3541
codePoint >= 'A' && codePoint <= 'Z' ||

0 commit comments

Comments
 (0)