1

feat: fluent.syntax

Портирование кода из fluent-kotlin
https://github.com/projectfluent/fluent-kotlin
This commit is contained in:
2024-03-29 13:44:27 +03:00
parent 3c36aec40d
commit 499c699cd1
329 changed files with 30594 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
crlf.ftl eol=crlf
cr.ftl eol=cr

View File

@@ -0,0 +1,8 @@
# ↓ BEL, U+0007
control0 = abcdef
# ↓ DEL, U+007F
delete = abcdef
# ↓ BPM, U+0082
control1 = abc‚def

View File

@@ -0,0 +1,148 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "control0",
"span": {
"type": "Span",
"start": 28,
"end": 36
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "abc\u0007def",
"span": {
"type": "Span",
"start": 39,
"end": 46
}
}
],
"span": {
"type": "Span",
"start": 39,
"end": 46
}
},
"attributes": [],
"comment": {
"content": " ↓ BEL, U+0007",
"type": "Comment",
"span": {
"type": "Span",
"start": 0,
"end": 27
}
},
"span": {
"type": "Span",
"start": 0,
"end": 46
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "delete",
"span": {
"type": "Span",
"start": 74,
"end": 80
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "abcdef",
"span": {
"type": "Span",
"start": 83,
"end": 90
}
}
],
"span": {
"type": "Span",
"start": 83,
"end": 90
}
},
"attributes": [],
"comment": {
"content": " ↓ DEL, U+007F",
"type": "Comment",
"span": {
"type": "Span",
"start": 48,
"end": 73
}
},
"span": {
"type": "Span",
"start": 48,
"end": 90
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "control1",
"span": {
"type": "Span",
"start": 120,
"end": 128
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "abc‚def",
"span": {
"type": "Span",
"start": 131,
"end": 138
}
}
],
"span": {
"type": "Span",
"start": 131,
"end": 138
}
},
"attributes": [],
"comment": {
"content": " ↓ BPM, U+0082",
"type": "Comment",
"span": {
"type": "Span",
"start": 92,
"end": 119
}
},
"span": {
"type": "Span",
"start": 92,
"end": 138
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 139
}
}

View File

@@ -0,0 +1,20 @@
face-with-tears-of-joy = 😂
tetragram-for-centre = 𝌆
surrogates-in-text = \uD83D\uDE02
surrogates-in-string = {"\uD83D\uDE02"}
surrogates-in-adjacent-strings = {"\uD83D"}{"\uDE02"}
emoji-in-text = A face 😂 with tears of joy.
emoji-in-string = {"A face 😂 with tears of joy."}
# ERROR Invalid identifier
err-😂 = Value
# ERROR Invalid expression
err-invalid-expression = { 😂 }
# ERROR Invalid variant key
err-invalid-variant-key = { $sel ->
*[😂] Value
}

View File

@@ -0,0 +1,414 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "face-with-tears-of-joy",
"span": {
"type": "Span",
"start": 0,
"end": 22
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "😂",
"span": {
"type": "Span",
"start": 25,
"end": 27
}
}
],
"span": {
"type": "Span",
"start": 25,
"end": 27
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 27
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "tetragram-for-centre",
"span": {
"type": "Span",
"start": 28,
"end": 48
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "𝌆",
"span": {
"type": "Span",
"start": 51,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 51,
"end": 53
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 28,
"end": 53
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "surrogates-in-text",
"span": {
"type": "Span",
"start": 55,
"end": 73
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "\\uD83D\\uDE02",
"span": {
"type": "Span",
"start": 76,
"end": 88
}
}
],
"span": {
"type": "Span",
"start": 76,
"end": 88
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 55,
"end": 88
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "surrogates-in-string",
"span": {
"type": "Span",
"start": 89,
"end": 109
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\uD83D\\uDE02",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 113,
"end": 127
}
},
"span": {
"type": "Span",
"start": 112,
"end": 128
}
}
],
"span": {
"type": "Span",
"start": 112,
"end": 128
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 89,
"end": 128
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "surrogates-in-adjacent-strings",
"span": {
"type": "Span",
"start": 129,
"end": 159
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\uD83D",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 163,
"end": 171
}
},
"span": {
"type": "Span",
"start": 162,
"end": 172
}
},
{
"type": "Placeable",
"expression": {
"value": "\\uDE02",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 173,
"end": 181
}
},
"span": {
"type": "Span",
"start": 172,
"end": 182
}
}
],
"span": {
"type": "Span",
"start": 162,
"end": 182
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 129,
"end": 182
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "emoji-in-text",
"span": {
"type": "Span",
"start": 184,
"end": 197
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A face 😂 with tears of joy.",
"span": {
"type": "Span",
"start": 200,
"end": 228
}
}
],
"span": {
"type": "Span",
"start": 200,
"end": 228
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 184,
"end": 228
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "emoji-in-string",
"span": {
"type": "Span",
"start": 229,
"end": 244
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "A face 😂 with tears of joy.",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 248,
"end": 278
}
},
"span": {
"type": "Span",
"start": 247,
"end": 279
}
}
],
"span": {
"type": "Span",
"start": 247,
"end": 279
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 229,
"end": 279
}
},
{
"content": "ERROR Invalid identifier",
"type": "Comment",
"span": {
"type": "Span",
"start": 281,
"end": 307
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 312,
"end": 312
}
}
],
"content": "err-😂 = Value\n\n",
"span": {
"type": "Span",
"start": 308,
"end": 324
}
},
{
"content": "ERROR Invalid expression",
"type": "Comment",
"span": {
"type": "Span",
"start": 324,
"end": 350
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0028",
"arguments": [],
"message": "Expected an inline expression",
"span": {
"type": "Span",
"start": 378,
"end": 378
}
}
],
"content": "err-invalid-expression = { 😂 }\n\n",
"span": {
"type": "Span",
"start": 351,
"end": 384
}
},
{
"content": "ERROR Invalid variant key",
"type": "Comment",
"span": {
"type": "Span",
"start": 384,
"end": 411
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0004",
"arguments": [
"a-zA-Z"
],
"message": "Expected a character from range: \"a-zA-Z\"",
"span": {
"type": "Span",
"start": 454,
"end": 454
}
}
],
"content": "err-invalid-variant-key = { $sel ->\n *[😂] Value\n}\n",
"span": {
"type": "Span",
"start": 412,
"end": 466
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 466
}
}

View File

@@ -0,0 +1,120 @@
## Function names
valid-func-name-01 = {FUN1()}
valid-func-name-02 = {FUN_FUN()}
valid-func-name-03 = {FUN-FUN()}
# JUNK 0 is not a valid Identifier start
invalid-func-name-01 = {0FUN()}
# JUNK Function names may not be lowercase
invalid-func-name-02 = {fun()}
# JUNK Function names may not contain lowercase character
invalid-func-name-03 = {Fun()}
# JUNK ? is not a valid Identifier character
invalid-func-name-04 = {FUN?()}
## Arguments
positional-args = {FUN(1, "a", msg)}
named-args = {FUN(x: 1, y: "Y")}
dense-named-args = {FUN(x:1, y:"Y")}
mixed-args = {FUN(1, "a", msg, x: 1, y: "Y")}
# ERROR Positional arg must not follow keyword args
shuffled-args = {FUN(1, x: 1, "a", y: "Y", msg)}
# ERROR Named arguments must be unique
duplicate-named-args = {FUN(x: 1, x: "X")}
## Whitespace around arguments
sparse-inline-call = {FUN ( "a" , msg, x: 1 )}
empty-inline-call = {FUN( )}
multiline-call = {FUN(
"a",
msg,
x: 1
)}
sparse-multiline-call = {FUN
(
"a" ,
msg
, x: 1
)}
empty-multiline-call = {FUN(
)}
unindented-arg-number = {FUN(
1)}
unindented-arg-string = {FUN(
"a")}
unindented-arg-msg-ref = {FUN(
msg)}
unindented-arg-term-ref = {FUN(
-msg)}
unindented-arg-var-ref = {FUN(
$var)}
unindented-arg-call = {FUN(
OTHER())}
unindented-named-arg = {FUN(
x:1)}
unindented-closing-paren = {FUN(
x
)}
## Optional trailing comma
one-argument = {FUN(1,)}
many-arguments = {FUN(1, 2, 3,)}
inline-sparse-args = {FUN( 1, 2, 3, )}
mulitline-args = {FUN(
1,
2,
)}
mulitline-sparse-args = {FUN(
1
,
2
,
)}
## Syntax errors for trailing comma
one-argument = {FUN(1,,)}
missing-arg = {FUN(,)}
missing-sparse-arg = {FUN( , )}
## Whitespace in named arguments
sparse-named-arg = {FUN(
x : 1,
y : 2,
z
:
3
)}
unindented-colon = {FUN(
x
:1)}
unindented-value = {FUN(
x:
1)}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
## Callees in placeables.
function-callee-placeable = {FUNCTION()}
term-callee-placeable = {-term()}
# ERROR Messages cannot be parameterized.
message-callee-placeable = {message()}
# ERROR Equivalent to a MessageReference callee.
mixed-case-callee-placeable = {Function()}
# ERROR Message attributes cannot be parameterized.
message-attr-callee-placeable = {message.attr()}
# ERROR Term attributes may not be used in Placeables.
term-attr-callee-placeable = {-term.attr()}
# ERROR Variables cannot be parameterized.
variable-callee-placeable = {$variable()}
## Callees in selectors.
function-callee-selector = {FUNCTION() ->
*[key] Value
}
term-attr-callee-selector = {-term.attr() ->
*[key] Value
}
# ERROR Messages cannot be parameterized.
message-callee-selector = {message() ->
*[key] Value
}
# ERROR Equivalent to a MessageReference callee.
mixed-case-callee-selector = {Function() ->
*[key] Value
}
# ERROR Message attributes cannot be parameterized.
message-attr-callee-selector = {message.attr() ->
*[key] Value
}
# ERROR Term values may not be used as selectors.
term-callee-selector = {-term() ->
*[key] Value
}
# ERROR Variables cannot be parameterized.
variable-callee-selector = {$variable() ->
*[key] Value
}

View File

@@ -0,0 +1,706 @@
{
"type": "Resource",
"body": [
{
"content": "Callees in placeables.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 25
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "function-callee-placeable",
"span": {
"type": "Span",
"start": 27,
"end": 52
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "FunctionReference",
"id": {
"type": "Identifier",
"name": "FUNCTION",
"span": {
"type": "Span",
"start": 56,
"end": 64
}
},
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [],
"span": {
"type": "Span",
"start": 64,
"end": 66
}
},
"span": {
"type": "Span",
"start": 56,
"end": 66
}
},
"span": {
"type": "Span",
"start": 55,
"end": 67
}
}
],
"span": {
"type": "Span",
"start": 55,
"end": 67
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 27,
"end": 67
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "term-callee-placeable",
"span": {
"type": "Span",
"start": 68,
"end": 89
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 94,
"end": 98
}
},
"attribute": null,
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [],
"span": {
"type": "Span",
"start": 98,
"end": 100
}
},
"span": {
"type": "Span",
"start": 93,
"end": 100
}
},
"span": {
"type": "Span",
"start": 92,
"end": 101
}
}
],
"span": {
"type": "Span",
"start": 92,
"end": 101
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 68,
"end": 101
}
},
{
"content": "ERROR Messages cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 103,
"end": 144
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0008",
"arguments": [],
"message": "The callee has to be an upper-case identifier or a term",
"span": {
"type": "Span",
"start": 180,
"end": 180
}
}
],
"content": "message-callee-placeable = {message()}\n",
"span": {
"type": "Span",
"start": 145,
"end": 184
}
},
{
"content": "ERROR Equivalent to a MessageReference callee.",
"type": "Comment",
"span": {
"type": "Span",
"start": 184,
"end": 232
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0008",
"arguments": [],
"message": "The callee has to be an upper-case identifier or a term",
"span": {
"type": "Span",
"start": 272,
"end": 272
}
}
],
"content": "mixed-case-callee-placeable = {Function()}\n",
"span": {
"type": "Span",
"start": 233,
"end": 276
}
},
{
"content": "ERROR Message attributes cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 276,
"end": 327
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 373,
"end": 373
}
}
],
"content": "message-attr-callee-placeable = {message.attr()}\n",
"span": {
"type": "Span",
"start": 328,
"end": 377
}
},
{
"content": "ERROR Term attributes may not be used in Placeables.",
"type": "Comment",
"span": {
"type": "Span",
"start": 377,
"end": 431
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0019",
"arguments": [],
"message": "Attributes of terms cannot be used as placeables",
"span": {
"type": "Span",
"start": 474,
"end": 474
}
}
],
"content": "term-attr-callee-placeable = {-term.attr()}\n",
"span": {
"type": "Span",
"start": 432,
"end": 476
}
},
{
"content": "ERROR Variables cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 476,
"end": 518
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 557,
"end": 557
}
}
],
"content": "variable-callee-placeable = {$variable()}\n\n\n",
"span": {
"type": "Span",
"start": 519,
"end": 563
}
},
{
"content": "Callees in selectors.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 563,
"end": 587
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "function-callee-selector",
"span": {
"type": "Span",
"start": 589,
"end": 613
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "FunctionReference",
"id": {
"type": "Identifier",
"name": "FUNCTION",
"span": {
"type": "Span",
"start": 617,
"end": 625
}
},
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [],
"span": {
"type": "Span",
"start": 625,
"end": 627
}
},
"span": {
"type": "Span",
"start": 617,
"end": 627
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 636,
"end": 639
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 641,
"end": 646
}
}
],
"span": {
"type": "Span",
"start": 641,
"end": 646
}
},
"default": true,
"span": {
"type": "Span",
"start": 634,
"end": 646
}
}
],
"span": {
"type": "Span",
"start": 617,
"end": 647
}
},
"span": {
"type": "Span",
"start": 616,
"end": 648
}
}
],
"span": {
"type": "Span",
"start": 616,
"end": 648
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 589,
"end": 648
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "term-attr-callee-selector",
"span": {
"type": "Span",
"start": 649,
"end": 674
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 679,
"end": 683
}
},
"attribute": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 684,
"end": 688
}
},
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [],
"span": {
"type": "Span",
"start": 688,
"end": 690
}
},
"span": {
"type": "Span",
"start": 678,
"end": 690
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 699,
"end": 702
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 704,
"end": 709
}
}
],
"span": {
"type": "Span",
"start": 704,
"end": 709
}
},
"default": true,
"span": {
"type": "Span",
"start": 697,
"end": 709
}
}
],
"span": {
"type": "Span",
"start": 678,
"end": 710
}
},
"span": {
"type": "Span",
"start": 677,
"end": 711
}
}
],
"span": {
"type": "Span",
"start": 677,
"end": 711
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 649,
"end": 711
}
},
{
"content": "ERROR Messages cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 713,
"end": 754
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0008",
"arguments": [],
"message": "The callee has to be an upper-case identifier or a term",
"span": {
"type": "Span",
"start": 789,
"end": 789
}
}
],
"content": "message-callee-selector = {message() ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 755,
"end": 813
}
},
{
"content": "ERROR Equivalent to a MessageReference callee.",
"type": "Comment",
"span": {
"type": "Span",
"start": 813,
"end": 861
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0008",
"arguments": [],
"message": "The callee has to be an upper-case identifier or a term",
"span": {
"type": "Span",
"start": 900,
"end": 900
}
}
],
"content": "mixed-case-callee-selector = {Function() ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 862,
"end": 924
}
},
{
"content": "ERROR Message attributes cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 924,
"end": 975
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 1020,
"end": 1020
}
}
],
"content": "message-attr-callee-selector = {message.attr() ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 976,
"end": 1044
}
},
{
"content": "ERROR Term values may not be used as selectors.",
"type": "Comment",
"span": {
"type": "Span",
"start": 1044,
"end": 1093
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0017",
"arguments": [],
"message": "Terms cannot be used as selectors",
"span": {
"type": "Span",
"start": 1126,
"end": 1126
}
}
],
"content": "term-callee-selector = {-term() ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 1094,
"end": 1147
}
},
{
"content": "ERROR Variables cannot be parameterized.",
"type": "Comment",
"span": {
"type": "Span",
"start": 1147,
"end": 1189
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 1227,
"end": 1227
}
}
],
"content": "variable-callee-selector = {$variable() ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 1190,
"end": 1251
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 1251
}
}

View File

@@ -0,0 +1,20 @@
# Standalone Comment
# Message Comment
foo = Foo
# Term Comment
# with a blank last line.
#
-term = Term
# Another standalone
#
# with indent
## Group Comment
### Resource Comment
# Errors
#error
##error
###error

View File

@@ -0,0 +1,219 @@
{
"type": "Resource",
"body": [
{
"content": "Standalone Comment",
"type": "Comment",
"span": {
"type": "Span",
"start": 0,
"end": 20
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "foo",
"span": {
"type": "Span",
"start": 40,
"end": 43
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Foo",
"span": {
"type": "Span",
"start": 46,
"end": 49
}
}
],
"span": {
"type": "Span",
"start": 46,
"end": 49
}
},
"attributes": [],
"comment": {
"content": "Message Comment",
"type": "Comment",
"span": {
"type": "Span",
"start": 22,
"end": 39
}
},
"span": {
"type": "Span",
"start": 22,
"end": 49
}
},
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 95,
"end": 99
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Term",
"span": {
"type": "Span",
"start": 102,
"end": 106
}
}
],
"span": {
"type": "Span",
"start": 102,
"end": 106
}
},
"attributes": [],
"comment": {
"content": "Term Comment\nwith a blank last line.\n",
"type": "Comment",
"span": {
"type": "Span",
"start": 51,
"end": 93
}
},
"span": {
"type": "Span",
"start": 51,
"end": 106
}
},
{
"content": "Another standalone\n\n with indent",
"type": "Comment",
"span": {
"type": "Span",
"start": 108,
"end": 150
}
},
{
"content": "Group Comment",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 151,
"end": 167
}
},
{
"content": "Resource Comment",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 168,
"end": 188
}
},
{
"content": "Errors",
"type": "Comment",
"span": {
"type": "Span",
"start": 190,
"end": 198
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
" "
],
"message": "Expected token: \" \"",
"span": {
"type": "Span",
"start": 200,
"end": 200
}
}
],
"content": "#error\n",
"span": {
"type": "Span",
"start": 199,
"end": 206
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
" "
],
"message": "Expected token: \" \"",
"span": {
"type": "Span",
"start": 208,
"end": 208
}
}
],
"content": "##error\n",
"span": {
"type": "Span",
"start": 206,
"end": 214
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
" "
],
"message": "Expected token: \" \"",
"span": {
"type": "Span",
"start": 217,
"end": 217
}
}
],
"content": "###error\n",
"span": {
"type": "Span",
"start": 214,
"end": 223
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 223
}
}

View File

@@ -0,0 +1 @@
### This entire file uses CR as EOL.

View File

@@ -0,0 +1,19 @@
{
"type": "Resource",
"body": [
{
"type": "ResourceComment",
"content": "This entire file uses CR as EOL.\r\rerr01 = Value 01\rerr02 = Value 02\r\rerr03 =\r\r Value 03\r Continued\r\r .title = Title\r\rerr04 = { \"str\r\rerr05 = { $sel -> }\r",
"span": {
"type": "Span",
"start": 0,
"end": 166
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 166
}
}

View File

@@ -0,0 +1,14 @@
key01 = Value 01
key02 =
Value 02
Continued
.title = Title
# ERROR Unclosed StringLiteral
err03 = { "str
# ERROR Missing newline after ->.
err04 = { $sel -> }

View File

@@ -0,0 +1,76 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 01"
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 02\nContinued"
}
]
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "title"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Title"
}
]
}
}
],
"comment": null
},
{
"type": "Comment",
"content": "ERROR Unclosed StringLiteral"
},
{
"type": "Junk",
"annotations": [],
"content": "err03 = { \"str\r\n\r\n"
},
{
"type": "Comment",
"content": "ERROR Missing newline after ->."
},
{
"type": "Junk",
"annotations": [],
"content": "err04 = { $sel -> }\r\n"
}
]
}

View File

@@ -0,0 +1,3 @@
### NOTE: Disable final newline insertion when editing this file.
# No EOL

View File

@@ -0,0 +1,28 @@
{
"type": "Resource",
"body": [
{
"content": "NOTE: Disable final newline insertion when editing this file.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 65
}
},
{
"content": "No EOL",
"type": "Comment",
"span": {
"type": "Span",
"start": 67,
"end": 75
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 75
}
}

View File

@@ -0,0 +1,9 @@
{
"type": "Resource",
"body": [],
"span": {
"type": "Span",
"start": 0,
"end": 0
}
}

View File

@@ -0,0 +1,3 @@
### NOTE: Disable final newline insertion when editing this file.
message-id

View File

@@ -0,0 +1,43 @@
{
"type": "Resource",
"body": [
{
"content": "NOTE: Disable final newline insertion when editing this file.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 65
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 77,
"end": 77
}
}
],
"content": "message-id",
"span": {
"type": "Span",
"start": 67,
"end": 77
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 77
}
}

View File

@@ -0,0 +1,3 @@
### NOTE: Disable final newline insertion when editing this file.
message-id =

View File

@@ -0,0 +1,43 @@
{
"type": "Resource",
"body": [
{
"content": "NOTE: Disable final newline insertion when editing this file.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 65
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0005",
"arguments": [
"message-id"
],
"message": "Expected message \"message-id\" to have a value or attributes",
"span": {
"type": "Span",
"start": 79,
"end": 79
}
}
],
"content": "message-id =",
"span": {
"type": "Span",
"start": 67,
"end": 79
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 79
}
}

View File

@@ -0,0 +1,3 @@
### NOTE: Disable final newline insertion when editing this file.
000

View File

@@ -0,0 +1,41 @@
{
"type": "Resource",
"body": [
{
"content": "NOTE: Disable final newline insertion when editing this file.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 65
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 67,
"end": 67
}
}
],
"content": "000",
"span": {
"type": "Span",
"start": 67,
"end": 70
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 70
}
}

View File

@@ -0,0 +1,3 @@
### NOTE: Disable final newline insertion when editing this file.
no-eol = No EOL

View File

@@ -0,0 +1,57 @@
{
"type": "Resource",
"body": [
{
"content": "NOTE: Disable final newline insertion when editing this file.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 65
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "no-eol",
"span": {
"type": "Span",
"start": 67,
"end": 73
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "No EOL",
"span": {
"type": "Span",
"start": 76,
"end": 82
}
}
],
"span": {
"type": "Span",
"start": 76,
"end": 82
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 67,
"end": 82
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 82
}
}

View File

@@ -0,0 +1,37 @@
## Literal text
text-backslash-one = Value with \ a backslash
text-backslash-two = Value with \\ two backslashes
text-backslash-brace = Value with \{placeable}
text-backslash-u = \u0041
text-backslash-backslash-u = \\u0041
## String literals
quote-in-string = {"\""}
backslash-in-string = {"\\"}
# ERROR Mismatched quote
mismatched-quote = {"\\""}
# ERROR Unknown escape
unknown-escape = {"\x"}
# ERROR Multiline literal
invalid-multiline-literal = {"
"}
## Unicode escapes
string-unicode-4digits = {"\u0041"}
escape-unicode-4digits = {"\\u0041"}
string-unicode-6digits = {"\U01F602"}
escape-unicode-6digits = {"\\U01F602"}
# OK The trailing "00" is part of the literal value.
string-too-many-4digits = {"\u004100"}
# OK The trailing "00" is part of the literal value.
string-too-many-6digits = {"\U01F60200"}
# ERROR Too few hex digits after \u.
string-too-few-4digits = {"\u41"}
# ERROR Too few hex digits after \U.
string-too-few-6digits = {"\U1F602"}
## Literal braces
brace-open = An opening {"{"} brace.
brace-close = A closing {"}"} brace.

View File

@@ -0,0 +1,937 @@
{
"type": "Resource",
"body": [
{
"content": "Literal text",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 15
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "text-backslash-one",
"span": {
"type": "Span",
"start": 16,
"end": 34
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value with \\ a backslash",
"span": {
"type": "Span",
"start": 37,
"end": 61
}
}
],
"span": {
"type": "Span",
"start": 37,
"end": 61
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 16,
"end": 61
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "text-backslash-two",
"span": {
"type": "Span",
"start": 62,
"end": 80
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value with \\\\ two backslashes",
"span": {
"type": "Span",
"start": 83,
"end": 112
}
}
],
"span": {
"type": "Span",
"start": 83,
"end": 112
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 62,
"end": 112
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "text-backslash-brace",
"span": {
"type": "Span",
"start": 113,
"end": 133
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value with \\",
"span": {
"type": "Span",
"start": 136,
"end": 148
}
},
{
"type": "Placeable",
"expression": {
"type": "MessageReference",
"id": {
"type": "Identifier",
"name": "placeable",
"span": {
"type": "Span",
"start": 149,
"end": 158
}
},
"attribute": null,
"span": {
"type": "Span",
"start": 149,
"end": 158
}
},
"span": {
"type": "Span",
"start": 148,
"end": 159
}
}
],
"span": {
"type": "Span",
"start": 136,
"end": 159
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 113,
"end": 159
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "text-backslash-u",
"span": {
"type": "Span",
"start": 160,
"end": 176
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "\\u0041",
"span": {
"type": "Span",
"start": 179,
"end": 185
}
}
],
"span": {
"type": "Span",
"start": 179,
"end": 185
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 160,
"end": 185
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "text-backslash-backslash-u",
"span": {
"type": "Span",
"start": 186,
"end": 212
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "\\\\u0041",
"span": {
"type": "Span",
"start": 215,
"end": 222
}
}
],
"span": {
"type": "Span",
"start": 215,
"end": 222
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 186,
"end": 222
}
},
{
"content": "String literals",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 224,
"end": 242
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "quote-in-string",
"span": {
"type": "Span",
"start": 243,
"end": 258
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\\"",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 262,
"end": 266
}
},
"span": {
"type": "Span",
"start": 261,
"end": 267
}
}
],
"span": {
"type": "Span",
"start": 261,
"end": 267
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 243,
"end": 267
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "backslash-in-string",
"span": {
"type": "Span",
"start": 268,
"end": 287
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\\\",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 291,
"end": 295
}
},
"span": {
"type": "Span",
"start": 290,
"end": 296
}
}
],
"span": {
"type": "Span",
"start": 290,
"end": 296
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 268,
"end": 296
}
},
{
"content": "ERROR Mismatched quote",
"type": "Comment",
"span": {
"type": "Span",
"start": 297,
"end": 321
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 346,
"end": 346
}
}
],
"content": "mismatched-quote = {\"\\\\\"\"}\n",
"span": {
"type": "Span",
"start": 322,
"end": 349
}
},
{
"content": "ERROR Unknown escape",
"type": "Comment",
"span": {
"type": "Span",
"start": 349,
"end": 371
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0025",
"arguments": [
"x"
],
"message": "Unknown escape sequence: \\x.",
"span": {
"type": "Span",
"start": 392,
"end": 392
}
}
],
"content": "unknown-escape = {\"\\x\"}\n",
"span": {
"type": "Span",
"start": 372,
"end": 396
}
},
{
"content": "ERROR Multiline literal",
"type": "Comment",
"span": {
"type": "Span",
"start": 396,
"end": 421
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0020",
"arguments": [],
"message": "Unterminated string expression",
"span": {
"type": "Span",
"start": 452,
"end": 452
}
}
],
"content": "invalid-multiline-literal = {\"\n \"}\n\n",
"span": {
"type": "Span",
"start": 422,
"end": 458
}
},
{
"content": "Unicode escapes",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 458,
"end": 476
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "string-unicode-4digits",
"span": {
"type": "Span",
"start": 477,
"end": 499
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\u0041",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 503,
"end": 511
}
},
"span": {
"type": "Span",
"start": 502,
"end": 512
}
}
],
"span": {
"type": "Span",
"start": 502,
"end": 512
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 477,
"end": 512
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "escape-unicode-4digits",
"span": {
"type": "Span",
"start": 513,
"end": 535
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\\\u0041",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 539,
"end": 548
}
},
"span": {
"type": "Span",
"start": 538,
"end": 549
}
}
],
"span": {
"type": "Span",
"start": 538,
"end": 549
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 513,
"end": 549
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "string-unicode-6digits",
"span": {
"type": "Span",
"start": 550,
"end": 572
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\U01F602",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 576,
"end": 586
}
},
"span": {
"type": "Span",
"start": 575,
"end": 587
}
}
],
"span": {
"type": "Span",
"start": 575,
"end": 587
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 550,
"end": 587
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "escape-unicode-6digits",
"span": {
"type": "Span",
"start": 588,
"end": 610
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\\\U01F602",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 614,
"end": 625
}
},
"span": {
"type": "Span",
"start": 613,
"end": 626
}
}
],
"span": {
"type": "Span",
"start": 613,
"end": 626
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 588,
"end": 626
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "string-too-many-4digits",
"span": {
"type": "Span",
"start": 681,
"end": 704
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\u004100",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 708,
"end": 718
}
},
"span": {
"type": "Span",
"start": 707,
"end": 719
}
}
],
"span": {
"type": "Span",
"start": 707,
"end": 719
}
},
"attributes": [],
"comment": {
"content": "OK The trailing \"00\" is part of the literal value.",
"type": "Comment",
"span": {
"type": "Span",
"start": 628,
"end": 680
}
},
"span": {
"type": "Span",
"start": 628,
"end": 719
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "string-too-many-6digits",
"span": {
"type": "Span",
"start": 773,
"end": 796
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "\\U01F60200",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 800,
"end": 812
}
},
"span": {
"type": "Span",
"start": 799,
"end": 813
}
}
],
"span": {
"type": "Span",
"start": 799,
"end": 813
}
},
"attributes": [],
"comment": {
"content": "OK The trailing \"00\" is part of the literal value.",
"type": "Comment",
"span": {
"type": "Span",
"start": 720,
"end": 772
}
},
"span": {
"type": "Span",
"start": 720,
"end": 813
}
},
{
"content": "ERROR Too few hex digits after \\u.",
"type": "Comment",
"span": {
"type": "Span",
"start": 815,
"end": 851
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0026",
"arguments": [
"\\u41\""
],
"message": "Invalid Unicode escape sequence: \\u41\".",
"span": {
"type": "Span",
"start": 883,
"end": 883
}
}
],
"content": "string-too-few-4digits = {\"\\u41\"}\n",
"span": {
"type": "Span",
"start": 852,
"end": 886
}
},
{
"content": "ERROR Too few hex digits after \\U.",
"type": "Comment",
"span": {
"type": "Span",
"start": 886,
"end": 922
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0026",
"arguments": [
"\\U1F602\""
],
"message": "Invalid Unicode escape sequence: \\U1F602\".",
"span": {
"type": "Span",
"start": 957,
"end": 957
}
}
],
"content": "string-too-few-6digits = {\"\\U1F602\"}\n\n",
"span": {
"type": "Span",
"start": 923,
"end": 961
}
},
{
"content": "Literal braces",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 961,
"end": 978
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "brace-open",
"span": {
"type": "Span",
"start": 979,
"end": 989
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "An opening ",
"span": {
"type": "Span",
"start": 992,
"end": 1003
}
},
{
"type": "Placeable",
"expression": {
"value": "{",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 1004,
"end": 1007
}
},
"span": {
"type": "Span",
"start": 1003,
"end": 1008
}
},
{
"type": "TextElement",
"value": " brace.",
"span": {
"type": "Span",
"start": 1008,
"end": 1015
}
}
],
"span": {
"type": "Span",
"start": 992,
"end": 1015
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 979,
"end": 1015
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "brace-close",
"span": {
"type": "Span",
"start": 1016,
"end": 1027
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A closing ",
"span": {
"type": "Span",
"start": 1030,
"end": 1040
}
},
{
"type": "Placeable",
"expression": {
"value": "}",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 1041,
"end": 1044
}
},
"span": {
"type": "Span",
"start": 1040,
"end": 1045
}
},
{
"type": "TextElement",
"value": " brace.",
"span": {
"type": "Span",
"start": 1045,
"end": 1052
}
}
],
"span": {
"type": "Span",
"start": 1030,
"end": 1052
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 1016,
"end": 1052
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 1053
}
}

View File

@@ -0,0 +1,21 @@
## Two adjacent Junks.
err01 = {1x}
err02 = {2x}
# A single Junk.
err03 = {1x
2
# A single Junk.
ą=Invalid identifier
ć=Another one
# The COMMENT ends this junk.
err04 = {
# COMMENT
# The COMMENT ends this junk.
# The closing brace is a separate Junk.
err04 = {
# COMMENT
}

View File

@@ -0,0 +1,233 @@
{
"type": "Resource",
"body": [
{
"content": "Two adjacent Junks.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 22
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 33,
"end": 33
}
}
],
"content": "err01 = {1x}\n",
"span": {
"type": "Span",
"start": 23,
"end": 36
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 46,
"end": 46
}
}
],
"content": "err02 = {2x}\n\n",
"span": {
"type": "Span",
"start": 36,
"end": 50
}
},
{
"content": "A single Junk.",
"type": "Comment",
"span": {
"type": "Span",
"start": 50,
"end": 66
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 77,
"end": 77
}
}
],
"content": "err03 = {1x\n2\n\n",
"span": {
"type": "Span",
"start": 67,
"end": 82
}
},
{
"content": "A single Junk.",
"type": "Comment",
"span": {
"type": "Span",
"start": 82,
"end": 98
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 99,
"end": 99
}
}
],
"content": "ą=Invalid identifier\nć=Another one\n\n",
"span": {
"type": "Span",
"start": 99,
"end": 135
}
},
{
"content": "The COMMENT ends this junk.",
"type": "Comment",
"span": {
"type": "Span",
"start": 135,
"end": 164
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0028",
"arguments": [],
"message": "Expected an inline expression",
"span": {
"type": "Span",
"start": 175,
"end": 175
}
}
],
"content": "err04 = {\n",
"span": {
"type": "Span",
"start": 165,
"end": 175
}
},
{
"content": "COMMENT",
"type": "Comment",
"span": {
"type": "Span",
"start": 175,
"end": 184
}
},
{
"content": "The COMMENT ends this junk.\nThe closing brace is a separate Junk.",
"type": "Comment",
"span": {
"type": "Span",
"start": 186,
"end": 255
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0028",
"arguments": [],
"message": "Expected an inline expression",
"span": {
"type": "Span",
"start": 266,
"end": 266
}
}
],
"content": "err04 = {\n",
"span": {
"type": "Span",
"start": 256,
"end": 266
}
},
{
"content": "COMMENT",
"type": "Comment",
"span": {
"type": "Span",
"start": 266,
"end": 275
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 276,
"end": 276
}
}
],
"content": "}\n",
"span": {
"type": "Span",
"start": 276,
"end": 278
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 278
}
}

View File

@@ -0,0 +1,76 @@
key01 = .Value
key02 = …Value
key03 = {"."}Value
key04 =
{"."}Value
key05 = Value
{"."}Continued
key06 = .Value
{"."}Continued
# MESSAGE (value = "Value", attributes = [])
# JUNK (attr .Continued" must have a value)
key07 = Value
.Continued
# JUNK (attr .Value must have a value)
key08 =
.Value
# JUNK (attr .Value must have a value)
key09 =
.Value
Continued
key10 =
.Value = which is an attribute
Continued
key11 =
{"."}Value = which looks like an attribute
Continued
key12 =
.accesskey =
A
key13 =
.attribute = .Value
key14 =
.attribute =
{"."}Value
key15 =
{ 1 ->
[one] .Value
*[other]
{"."}Value
}
# JUNK (variant must have a value)
key16 =
{ 1 ->
*[one]
.Value
}
# JUNK (unclosed placeable)
key17 =
{ 1 ->
*[one] Value
.Continued
}
# JUNK (attr .Value must have a value)
key18 =
.Value
key19 =
.attribute = Value
Continued
key20 =
{"."}Value

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
string-expression = {"abc"}
number-expression = {123}
number-expression = {-3.14}

View File

@@ -0,0 +1,148 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "string-expression",
"span": {
"type": "Span",
"start": 0,
"end": 17
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "abc",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 21,
"end": 26
}
},
"span": {
"type": "Span",
"start": 20,
"end": 27
}
}
],
"span": {
"type": "Span",
"start": 20,
"end": 27
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 27
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "number-expression",
"span": {
"type": "Span",
"start": 28,
"end": 45
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "123",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 49,
"end": 52
}
},
"span": {
"type": "Span",
"start": 48,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 48,
"end": 53
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 28,
"end": 53
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "number-expression",
"span": {
"type": "Span",
"start": 54,
"end": 71
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "-3.14",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 75,
"end": 80
}
},
"span": {
"type": "Span",
"start": 74,
"end": 81
}
}
],
"span": {
"type": "Span",
"start": 74,
"end": 81
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 54,
"end": 81
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 82
}
}

View File

@@ -0,0 +1,19 @@
## Member expressions in placeables.
# OK Message attributes may be interpolated in values.
message-attribute-expression-placeable = {msg.attr}
# ERROR Term attributes may not be used for interpolation.
term-attribute-expression-placeable = {-term.attr}
## Member expressions in selectors.
# OK Term attributes may be used as selectors.
term-attribute-expression-selector = {-term.attr ->
*[key] Value
}
# ERROR Message attributes may not be used as selectors.
message-attribute-expression-selector = {msg.attr ->
*[key] Value
}

View File

@@ -0,0 +1,280 @@
{
"type": "Resource",
"body": [
{
"content": "Member expressions in placeables.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 36
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "message-attribute-expression-placeable",
"span": {
"type": "Span",
"start": 93,
"end": 131
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "MessageReference",
"id": {
"type": "Identifier",
"name": "msg",
"span": {
"type": "Span",
"start": 135,
"end": 138
}
},
"attribute": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 139,
"end": 143
}
},
"span": {
"type": "Span",
"start": 135,
"end": 143
}
},
"span": {
"type": "Span",
"start": 134,
"end": 144
}
}
],
"span": {
"type": "Span",
"start": 134,
"end": 144
}
},
"attributes": [],
"comment": {
"content": "OK Message attributes may be interpolated in values.",
"type": "Comment",
"span": {
"type": "Span",
"start": 38,
"end": 92
}
},
"span": {
"type": "Span",
"start": 38,
"end": 144
}
},
{
"content": "ERROR Term attributes may not be used for interpolation.",
"type": "Comment",
"span": {
"type": "Span",
"start": 146,
"end": 204
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0019",
"arguments": [],
"message": "Attributes of terms cannot be used as placeables",
"span": {
"type": "Span",
"start": 254,
"end": 254
}
}
],
"content": "term-attribute-expression-placeable = {-term.attr}\n\n\n",
"span": {
"type": "Span",
"start": 205,
"end": 258
}
},
{
"content": "Member expressions in selectors.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 258,
"end": 293
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "term-attribute-expression-selector",
"span": {
"type": "Span",
"start": 342,
"end": 376
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 381,
"end": 385
}
},
"attribute": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 386,
"end": 390
}
},
"arguments": null,
"span": {
"type": "Span",
"start": 380,
"end": 390
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 399,
"end": 402
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 404,
"end": 409
}
}
],
"span": {
"type": "Span",
"start": 404,
"end": 409
}
},
"default": true,
"span": {
"type": "Span",
"start": 397,
"end": 409
}
}
],
"span": {
"type": "Span",
"start": 380,
"end": 410
}
},
"span": {
"type": "Span",
"start": 379,
"end": 411
}
}
],
"span": {
"type": "Span",
"start": 379,
"end": 411
}
},
"attributes": [],
"comment": {
"content": "OK Term attributes may be used as selectors.",
"type": "Comment",
"span": {
"type": "Span",
"start": 295,
"end": 341
}
},
"span": {
"type": "Span",
"start": 295,
"end": 411
}
},
{
"content": "ERROR Message attributes may not be used as selectors.",
"type": "Comment",
"span": {
"type": "Span",
"start": 412,
"end": 468
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0018",
"arguments": [],
"message": "Attributes of messages cannot be used as selectors",
"span": {
"type": "Span",
"start": 519,
"end": 519
}
}
],
"content": "message-attribute-expression-selector = {msg.attr ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 469,
"end": 540
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 540
}
}

View File

@@ -0,0 +1,49 @@
key01 = Value
key02 = Value
.attr = Attribute
key02 = Value
.attr1 = Attribute 1
.attr2 = Attribute 2
key03 =
.attr = Attribute
key04 =
.attr1 = Attribute 1
.attr2 = Attribute 2
# < whitespace >
key05 =
.attr1 = Attribute 1
no-whitespace=Value
.attr1=Attribute 1
extra-whitespace = Value
.attr1 = Attribute 1
key06 = {""}
# JUNK Missing value
key07 =
# JUNK Missing =
key08
KEY09 = Value 09
key-10 = Value 10
key_11 = Value 11
key-12- = Value 12
key_13_ = Value 13
# JUNK Invalid id
0err-14 = Value 14
# JUNK Invalid id
err-15? = Value 15
# JUNK Invalid id
err-ąę-16 = Value 16

View File

@@ -0,0 +1,998 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 0,
"end": 5
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 8,
"end": 13
}
}
],
"span": {
"type": "Span",
"start": 8,
"end": 13
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 13
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 15,
"end": 20
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 23,
"end": 28
}
}
],
"span": {
"type": "Span",
"start": 23,
"end": 28
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 34,
"end": 38
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 41,
"end": 50
}
}
],
"span": {
"type": "Span",
"start": 41,
"end": 50
}
},
"span": {
"type": "Span",
"start": 33,
"end": 50
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 15,
"end": 50
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 52,
"end": 57
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 60,
"end": 65
}
}
],
"span": {
"type": "Span",
"start": 60,
"end": 65
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr1",
"span": {
"type": "Span",
"start": 71,
"end": 76
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 1",
"span": {
"type": "Span",
"start": 79,
"end": 90
}
}
],
"span": {
"type": "Span",
"start": 79,
"end": 90
}
},
"span": {
"type": "Span",
"start": 70,
"end": 90
}
},
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr2",
"span": {
"type": "Span",
"start": 96,
"end": 101
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 2",
"span": {
"type": "Span",
"start": 104,
"end": 115
}
}
],
"span": {
"type": "Span",
"start": 104,
"end": 115
}
},
"span": {
"type": "Span",
"start": 95,
"end": 115
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 52,
"end": 115
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 117,
"end": 122
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 130,
"end": 134
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 137,
"end": 146
}
}
],
"span": {
"type": "Span",
"start": 137,
"end": 146
}
},
"span": {
"type": "Span",
"start": 129,
"end": 146
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 117,
"end": 146
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 148,
"end": 153
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr1",
"span": {
"type": "Span",
"start": 161,
"end": 166
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 1",
"span": {
"type": "Span",
"start": 169,
"end": 180
}
}
],
"span": {
"type": "Span",
"start": 169,
"end": 180
}
},
"span": {
"type": "Span",
"start": 160,
"end": 180
}
},
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr2",
"span": {
"type": "Span",
"start": 186,
"end": 191
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 2",
"span": {
"type": "Span",
"start": 194,
"end": 205
}
}
],
"span": {
"type": "Span",
"start": 194,
"end": 205
}
},
"span": {
"type": "Span",
"start": 185,
"end": 205
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 148,
"end": 205
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key05",
"span": {
"type": "Span",
"start": 231,
"end": 236
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr1",
"span": {
"type": "Span",
"start": 260,
"end": 265
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 1",
"span": {
"type": "Span",
"start": 268,
"end": 279
}
}
],
"span": {
"type": "Span",
"start": 268,
"end": 279
}
},
"span": {
"type": "Span",
"start": 259,
"end": 279
}
}
],
"comment": {
"content": " < whitespace >",
"type": "Comment",
"span": {
"type": "Span",
"start": 207,
"end": 230
}
},
"span": {
"type": "Span",
"start": 207,
"end": 279
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "no-whitespace",
"span": {
"type": "Span",
"start": 281,
"end": 294
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 295,
"end": 300
}
}
],
"span": {
"type": "Span",
"start": 295,
"end": 300
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr1",
"span": {
"type": "Span",
"start": 306,
"end": 311
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 1",
"span": {
"type": "Span",
"start": 312,
"end": 323
}
}
],
"span": {
"type": "Span",
"start": 312,
"end": 323
}
},
"span": {
"type": "Span",
"start": 305,
"end": 323
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 281,
"end": 323
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "extra-whitespace",
"span": {
"type": "Span",
"start": 325,
"end": 341
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 348,
"end": 353
}
}
],
"span": {
"type": "Span",
"start": 348,
"end": 353
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr1",
"span": {
"type": "Span",
"start": 359,
"end": 364
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute 1",
"span": {
"type": "Span",
"start": 374,
"end": 385
}
}
],
"span": {
"type": "Span",
"start": 374,
"end": 385
}
},
"span": {
"type": "Span",
"start": 358,
"end": 385
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 325,
"end": 385
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key06",
"span": {
"type": "Span",
"start": 387,
"end": 392
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 396,
"end": 398
}
},
"span": {
"type": "Span",
"start": 395,
"end": 399
}
}
],
"span": {
"type": "Span",
"start": 395,
"end": 399
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 387,
"end": 399
}
},
{
"content": "JUNK Missing value",
"type": "Comment",
"span": {
"type": "Span",
"start": 401,
"end": 421
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0005",
"arguments": [
"key07"
],
"message": "Expected message \"key07\" to have a value or attributes",
"span": {
"type": "Span",
"start": 429,
"end": 429
}
}
],
"content": "key07 =\n\n",
"span": {
"type": "Span",
"start": 422,
"end": 431
}
},
{
"content": "JUNK Missing =",
"type": "Comment",
"span": {
"type": "Span",
"start": 431,
"end": 447
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 453,
"end": 453
}
}
],
"content": "key08\n\n",
"span": {
"type": "Span",
"start": 448,
"end": 455
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "KEY09",
"span": {
"type": "Span",
"start": 455,
"end": 460
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 09",
"span": {
"type": "Span",
"start": 463,
"end": 471
}
}
],
"span": {
"type": "Span",
"start": 463,
"end": 471
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 455,
"end": 471
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key-10",
"span": {
"type": "Span",
"start": 473,
"end": 479
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 10",
"span": {
"type": "Span",
"start": 482,
"end": 490
}
}
],
"span": {
"type": "Span",
"start": 482,
"end": 490
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 473,
"end": 490
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key_11",
"span": {
"type": "Span",
"start": 491,
"end": 497
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 11",
"span": {
"type": "Span",
"start": 500,
"end": 508
}
}
],
"span": {
"type": "Span",
"start": 500,
"end": 508
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 491,
"end": 508
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key-12-",
"span": {
"type": "Span",
"start": 509,
"end": 516
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 12",
"span": {
"type": "Span",
"start": 519,
"end": 527
}
}
],
"span": {
"type": "Span",
"start": 519,
"end": 527
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 509,
"end": 527
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key_13_",
"span": {
"type": "Span",
"start": 528,
"end": 535
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 13",
"span": {
"type": "Span",
"start": 538,
"end": 546
}
}
],
"span": {
"type": "Span",
"start": 538,
"end": 546
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 528,
"end": 546
}
},
{
"content": "JUNK Invalid id",
"type": "Comment",
"span": {
"type": "Span",
"start": 548,
"end": 565
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 566,
"end": 566
}
}
],
"content": "0err-14 = Value 14\n\n",
"span": {
"type": "Span",
"start": 566,
"end": 586
}
},
{
"content": "JUNK Invalid id",
"type": "Comment",
"span": {
"type": "Span",
"start": 586,
"end": 603
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 610,
"end": 610
}
}
],
"content": "err-15? = Value 15\n\n",
"span": {
"type": "Span",
"start": 604,
"end": 624
}
},
{
"content": "JUNK Invalid id",
"type": "Comment",
"span": {
"type": "Span",
"start": 624,
"end": 641
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 646,
"end": 646
}
}
],
"content": "err-ąę-16 = Value 16\n",
"span": {
"type": "Span",
"start": 642,
"end": 663
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 663
}
}

View File

@@ -0,0 +1,24 @@
# License Comment
### Resource Comment
-brand-name = Aurora
## Group Comment
key01 =
.attr = Attribute
ą=Invalid identifier
ć=Another one
# Message Comment
key02 = Value
# Standalone Comment
.attr = Dangling attribute
# There are 5 spaces on the line between key03 and key04.
key03 = Value 03
key04 = Value 04

View File

@@ -0,0 +1,315 @@
{
"type": "Resource",
"body": [
{
"content": "License Comment",
"type": "Comment",
"span": {
"type": "Span",
"start": 0,
"end": 17
}
},
{
"content": "Resource Comment",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 19,
"end": 39
}
},
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "brand-name",
"span": {
"type": "Span",
"start": 42,
"end": 52
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Aurora",
"span": {
"type": "Span",
"start": 55,
"end": 61
}
}
],
"span": {
"type": "Span",
"start": 55,
"end": 61
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 41,
"end": 61
}
},
{
"content": "Group Comment",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 63,
"end": 79
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 81,
"end": 86
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 94,
"end": 98
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 101,
"end": 110
}
}
],
"span": {
"type": "Span",
"start": 101,
"end": 110
}
},
"span": {
"type": "Span",
"start": 93,
"end": 110
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 81,
"end": 110
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 112,
"end": 112
}
}
],
"content": "ą=Invalid identifier\nć=Another one\n\n",
"span": {
"type": "Span",
"start": 112,
"end": 148
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 166,
"end": 171
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 174,
"end": 179
}
}
],
"span": {
"type": "Span",
"start": 174,
"end": 179
}
},
"attributes": [],
"comment": {
"content": "Message Comment",
"type": "Comment",
"span": {
"type": "Span",
"start": 148,
"end": 165
}
},
"span": {
"type": "Span",
"start": 148,
"end": 179
}
},
{
"content": "Standalone Comment",
"type": "Comment",
"span": {
"type": "Span",
"start": 181,
"end": 201
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 202,
"end": 202
}
}
],
"content": " .attr = Dangling attribute\n\n",
"span": {
"type": "Span",
"start": 202,
"end": 234
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 292,
"end": 297
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 03",
"span": {
"type": "Span",
"start": 300,
"end": 308
}
}
],
"span": {
"type": "Span",
"start": 300,
"end": 308
}
},
"attributes": [],
"comment": {
"content": "There are 5 spaces on the line between key03 and key04.",
"type": "Comment",
"span": {
"type": "Span",
"start": 234,
"end": 291
}
},
"span": {
"type": "Span",
"start": 234,
"end": 308
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 315,
"end": 320
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value 04",
"span": {
"type": "Span",
"start": 323,
"end": 331
}
}
],
"span": {
"type": "Span",
"start": 323,
"end": 331
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 315,
"end": 331
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 332
}
}

View File

@@ -0,0 +1,60 @@
key01 = A multiline value
continued on the next line
and also down here.
key02 =
A multiline value starting
on a new line.
key03 =
.attr = A multiline attribute value
continued on the next line
and also down here.
key04 =
.attr =
A multiline attribute value
staring on a new line
key05 =
A multiline value with non-standard
indentation.
key06 =
A multiline value with {"placeables"}
{"at"} the beginning and the end
{"of lines"}{"."}
key07 =
{"A multiline value"} starting and ending {"with a placeable"}
key08 = Leading and trailing whitespace.
key09 = zero
three
two
one
zero
key10 =
two
zero
four
key11 =
two
zero
key12 =
{"."}
four
key13 =
four
{"."}

View File

@@ -0,0 +1,696 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 0,
"end": 5
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline value\ncontinued on the next line\n\nand also down here.",
"span": {
"type": "Span",
"start": 8,
"end": 81
}
}
],
"span": {
"type": "Span",
"start": 8,
"end": 81
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 81
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 83,
"end": 88
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline value starting\non a new line.",
"span": {
"type": "Span",
"start": 95,
"end": 140
}
}
],
"span": {
"type": "Span",
"start": 91,
"end": 140
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 83,
"end": 140
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 142,
"end": 147
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 155,
"end": 159
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline attribute value\ncontinued on the next line\n\nand also down here.",
"span": {
"type": "Span",
"start": 162,
"end": 253
}
}
],
"span": {
"type": "Span",
"start": 162,
"end": 253
}
},
"span": {
"type": "Span",
"start": 154,
"end": 253
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 142,
"end": 253
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 255,
"end": 260
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 268,
"end": 272
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline attribute value\nstaring on a new line",
"span": {
"type": "Span",
"start": 283,
"end": 340
}
}
],
"span": {
"type": "Span",
"start": 275,
"end": 340
}
},
"span": {
"type": "Span",
"start": 267,
"end": 340
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 255,
"end": 340
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key05",
"span": {
"type": "Span",
"start": 342,
"end": 347
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline value with non-standard\n\n indentation.",
"span": {
"type": "Span",
"start": 352,
"end": 406
}
}
],
"span": {
"type": "Span",
"start": 351,
"end": 406
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 342,
"end": 406
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key06",
"span": {
"type": "Span",
"start": 408,
"end": 413
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "A multiline value with ",
"span": {
"type": "Span",
"start": 420,
"end": 443
}
},
{
"type": "Placeable",
"expression": {
"value": "placeables",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 444,
"end": 456
}
},
"span": {
"type": "Span",
"start": 443,
"end": 457
}
},
{
"type": "TextElement",
"value": "\n",
"span": {
"type": "Span",
"start": 457,
"end": 462
}
},
{
"type": "Placeable",
"expression": {
"value": "at",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 463,
"end": 467
}
},
"span": {
"type": "Span",
"start": 462,
"end": 468
}
},
{
"type": "TextElement",
"value": " the beginning and the end\n",
"span": {
"type": "Span",
"start": 468,
"end": 499
}
},
{
"type": "Placeable",
"expression": {
"value": "of lines",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 500,
"end": 510
}
},
"span": {
"type": "Span",
"start": 499,
"end": 511
}
},
{
"type": "Placeable",
"expression": {
"value": ".",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 512,
"end": 515
}
},
"span": {
"type": "Span",
"start": 511,
"end": 516
}
}
],
"span": {
"type": "Span",
"start": 416,
"end": 516
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 408,
"end": 516
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key07",
"span": {
"type": "Span",
"start": 518,
"end": 523
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "A multiline value",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 531,
"end": 550
}
},
"span": {
"type": "Span",
"start": 530,
"end": 551
}
},
{
"type": "TextElement",
"value": " starting and ending ",
"span": {
"type": "Span",
"start": 551,
"end": 572
}
},
{
"type": "Placeable",
"expression": {
"value": "with a placeable",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 573,
"end": 591
}
},
"span": {
"type": "Span",
"start": 572,
"end": 592
}
}
],
"span": {
"type": "Span",
"start": 526,
"end": 592
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 518,
"end": 592
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key08",
"span": {
"type": "Span",
"start": 594,
"end": 599
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Leading and trailing whitespace.",
"span": {
"type": "Span",
"start": 606,
"end": 643
}
}
],
"span": {
"type": "Span",
"start": 606,
"end": 643
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 594,
"end": 643
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key09",
"span": {
"type": "Span",
"start": 645,
"end": 650
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "zero\n three\n two\n one\nzero",
"span": {
"type": "Span",
"start": 653,
"end": 690
}
}
],
"span": {
"type": "Span",
"start": 653,
"end": 690
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 645,
"end": 690
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key10",
"span": {
"type": "Span",
"start": 692,
"end": 697
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": " two\nzero\n four",
"span": {
"type": "Span",
"start": 700,
"end": 731
}
}
],
"span": {
"type": "Span",
"start": 700,
"end": 731
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 692,
"end": 731
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key11",
"span": {
"type": "Span",
"start": 733,
"end": 738
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": " two\nzero",
"span": {
"type": "Span",
"start": 743,
"end": 761
}
}
],
"span": {
"type": "Span",
"start": 743,
"end": 761
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 733,
"end": 761
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key12",
"span": {
"type": "Span",
"start": 763,
"end": 768
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": ".",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 772,
"end": 775
}
},
"span": {
"type": "Span",
"start": 771,
"end": 776
}
},
{
"type": "TextElement",
"value": "\n four",
"span": {
"type": "Span",
"start": 776,
"end": 785
}
}
],
"span": {
"type": "Span",
"start": 771,
"end": 785
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 763,
"end": 785
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key13",
"span": {
"type": "Span",
"start": 787,
"end": 792
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": " four\n",
"span": {
"type": "Span",
"start": 795,
"end": 804
}
},
{
"type": "Placeable",
"expression": {
"value": ".",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 805,
"end": 808
}
},
"span": {
"type": "Span",
"start": 804,
"end": 809
}
}
],
"span": {
"type": "Span",
"start": 795,
"end": 809
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 787,
"end": 809
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 810
}
}

View File

@@ -0,0 +1,38 @@
int-zero = {0}
int-positive = {1}
int-negative = {-1}
int-negative-zero = {-0}
int-positive-padded = {01}
int-negative-padded = {-01}
int-zero-padded = {00}
int-negative-zero-padded = {-00}
float-zero = {0.0}
float-positive = {0.01}
float-positive-one = {1.03}
float-positive-without-fraction = {1.000}
float-negative = {-0.01}
float-negative-one = {-1.03}
float-negative-zero = {-0.0}
float-negative-without-fraction = {-1.000}
float-positive-padded-left = {01.03}
float-positive-padded-right = {1.0300}
float-positive-padded-both = {01.0300}
float-negative-padded-left = {-01.03}
float-negative-padded-right = {-1.0300}
float-negative-padded-both = {-01.0300}
## ERRORS
err01 = {1.}
err02 = {.02}
err03 = {1.02.03}
err04 = {1. 02}
err05 = {1 .02}
err06 = {- 1}
err07 = {1,02}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,29 @@
### The syntax in this file has been discontinued. It is no longer part of the
### Fluent specification and should not be implemented nor used. We're keeping
### these fixtures around to protect against accidental syntax reuse.
## Variant lists.
message-variant-list =
{
*[key] Value
}
-term-variant-list =
{
*[key] Value
}
## Variant expressions.
message-variant-expression-placeable = {msg[case]}
message-variant-expression-selector = {msg[case] ->
*[key] Value
}
term-variant-expression-placeable = {-term[case]}
term-variant-expression-selector = {-term[case] ->
*[key] Value
}

View File

@@ -0,0 +1,177 @@
{
"type": "Resource",
"body": [
{
"content": "The syntax in this file has been discontinued. It is no longer part of the\nFluent specification and should not be implemented nor used. We're keeping\nthese fixtures around to protect against accidental syntax reuse.",
"type": "ResourceComment",
"span": {
"type": "Span",
"start": 0,
"end": 227
}
},
{
"content": "Variant lists.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 230,
"end": 247
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0028",
"arguments": [],
"message": "Expected an inline expression",
"span": {
"type": "Span",
"start": 285,
"end": 285
}
}
],
"content": "message-variant-list =\n {\n *[key] Value\n }\n\n",
"span": {
"type": "Span",
"start": 249,
"end": 305
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0028",
"arguments": [],
"message": "Expected an inline expression",
"span": {
"type": "Span",
"start": 339,
"end": 339
}
}
],
"content": "-term-variant-list =\n {\n *[key] Value\n }\n\n\n",
"span": {
"type": "Span",
"start": 305,
"end": 360
}
},
{
"content": "Variant expressions.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 360,
"end": 383
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 428,
"end": 428
}
}
],
"content": "message-variant-expression-placeable = {msg[case]}\n",
"span": {
"type": "Span",
"start": 385,
"end": 436
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 478,
"end": 478
}
}
],
"content": "message-variant-expression-selector = {msg[case] ->\n *[key] Value\n}\n\n",
"span": {
"type": "Span",
"start": 436,
"end": 507
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 549,
"end": 549
}
}
],
"content": "term-variant-expression-placeable = {-term[case]}\n",
"span": {
"type": "Span",
"start": 507,
"end": 557
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 598,
"end": 598
}
}
],
"content": "term-variant-expression-selector = {-term[case] ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 557,
"end": 626
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 626
}
}

View File

@@ -0,0 +1,15 @@
nested-placeable = {{{1}}}
padded-placeable = { 1 }
sparse-placeable = { { 1 } }
# ERROR Unmatched opening brace
unmatched-open1 = { 1
# ERROR Unmatched opening brace
unmatched-open2 = {{ 1 }
# ERROR Unmatched closing brace
unmatched-close1 = 1 }
# ERROR Unmatched closing brace
unmatched-close2 = { 1 }}

View File

@@ -0,0 +1,300 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "nested-placeable",
"span": {
"type": "Span",
"start": 0,
"end": 16
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "Placeable",
"expression": {
"type": "Placeable",
"expression": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 22,
"end": 23
}
},
"span": {
"type": "Span",
"start": 21,
"end": 24
}
},
"span": {
"type": "Span",
"start": 20,
"end": 25
}
},
"span": {
"type": "Span",
"start": 19,
"end": 26
}
}
],
"span": {
"type": "Span",
"start": 19,
"end": 26
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 26
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "padded-placeable",
"span": {
"type": "Span",
"start": 27,
"end": 43
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 49,
"end": 50
}
},
"span": {
"type": "Span",
"start": 46,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 46,
"end": 53
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 27,
"end": 53
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "sparse-placeable",
"span": {
"type": "Span",
"start": 54,
"end": 70
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "Placeable",
"expression": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 77,
"end": 78
}
},
"span": {
"type": "Span",
"start": 75,
"end": 80
}
},
"span": {
"type": "Span",
"start": 73,
"end": 82
}
}
],
"span": {
"type": "Span",
"start": 73,
"end": 82
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 54,
"end": 82
}
},
{
"content": "ERROR Unmatched opening brace",
"type": "Comment",
"span": {
"type": "Span",
"start": 84,
"end": 115
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 139,
"end": 139
}
}
],
"content": "unmatched-open1 = { 1\n\n",
"span": {
"type": "Span",
"start": 116,
"end": 139
}
},
{
"content": "ERROR Unmatched opening brace",
"type": "Comment",
"span": {
"type": "Span",
"start": 139,
"end": 170
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"}"
],
"message": "Expected token: \"}\"",
"span": {
"type": "Span",
"start": 197,
"end": 197
}
}
],
"content": "unmatched-open2 = {{ 1 }\n\n",
"span": {
"type": "Span",
"start": 171,
"end": 197
}
},
{
"content": "ERROR Unmatched closing brace",
"type": "Comment",
"span": {
"type": "Span",
"start": 197,
"end": 228
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0027",
"arguments": [],
"message": "Unbalanced closing brace in TextElement.",
"span": {
"type": "Span",
"start": 250,
"end": 250
}
}
],
"content": "unmatched-close1 = 1 }\n\n",
"span": {
"type": "Span",
"start": 229,
"end": 253
}
},
{
"content": "ERROR Unmatched closing brace",
"type": "Comment",
"span": {
"type": "Span",
"start": 253,
"end": 284
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0027",
"arguments": [],
"message": "Unbalanced closing brace in TextElement.",
"span": {
"type": "Span",
"start": 309,
"end": 309
}
}
],
"content": "unmatched-close2 = { 1 }}\n",
"span": {
"type": "Span",
"start": 285,
"end": 311
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 311
}
}

View File

@@ -0,0 +1,30 @@
## Reference expressions in placeables.
message-reference-placeable = {msg}
term-reference-placeable = {-term}
variable-reference-placeable = {$var}
# Function references are invalid outside of call expressions.
# This parses as a valid MessageReference.
function-reference-placeable = {FUN}
## Reference expressions in selectors.
variable-reference-selector = {$var ->
*[key] Value
}
# ERROR Message values may not be used as selectors.
message-reference-selector = {msg ->
*[key] Value
}
# ERROR Term values may not be used as selectors.
term-reference-selector = {-term ->
*[key] Value
}
# ERROR Function references are invalid outside of call expressions, and this
# parses as a MessageReference which isn't a valid selector.
function-expression-selector = {FUN ->
*[key] Value
}

View File

@@ -0,0 +1,450 @@
{
"type": "Resource",
"body": [
{
"content": "Reference expressions in placeables.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 39
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "message-reference-placeable",
"span": {
"type": "Span",
"start": 41,
"end": 68
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "MessageReference",
"id": {
"type": "Identifier",
"name": "msg",
"span": {
"type": "Span",
"start": 72,
"end": 75
}
},
"attribute": null,
"span": {
"type": "Span",
"start": 72,
"end": 75
}
},
"span": {
"type": "Span",
"start": 71,
"end": 76
}
}
],
"span": {
"type": "Span",
"start": 71,
"end": 76
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 41,
"end": 76
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "term-reference-placeable",
"span": {
"type": "Span",
"start": 77,
"end": 101
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 106,
"end": 110
}
},
"attribute": null,
"arguments": null,
"span": {
"type": "Span",
"start": 105,
"end": 110
}
},
"span": {
"type": "Span",
"start": 104,
"end": 111
}
}
],
"span": {
"type": "Span",
"start": 104,
"end": 111
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 77,
"end": 111
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "variable-reference-placeable",
"span": {
"type": "Span",
"start": 112,
"end": 140
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 145,
"end": 148
}
},
"span": {
"type": "Span",
"start": 144,
"end": 148
}
},
"span": {
"type": "Span",
"start": 143,
"end": 149
}
}
],
"span": {
"type": "Span",
"start": 143,
"end": 149
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 112,
"end": 149
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "function-reference-placeable",
"span": {
"type": "Span",
"start": 257,
"end": 285
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "MessageReference",
"id": {
"type": "Identifier",
"name": "FUN",
"span": {
"type": "Span",
"start": 289,
"end": 292
}
},
"attribute": null,
"span": {
"type": "Span",
"start": 289,
"end": 292
}
},
"span": {
"type": "Span",
"start": 288,
"end": 293
}
}
],
"span": {
"type": "Span",
"start": 288,
"end": 293
}
},
"attributes": [],
"comment": {
"content": "Function references are invalid outside of call expressions.\nThis parses as a valid MessageReference.",
"type": "Comment",
"span": {
"type": "Span",
"start": 151,
"end": 256
}
},
"span": {
"type": "Span",
"start": 151,
"end": 293
}
},
{
"content": "Reference expressions in selectors.",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 296,
"end": 334
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "variable-reference-selector",
"span": {
"type": "Span",
"start": 336,
"end": 363
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 368,
"end": 371
}
},
"span": {
"type": "Span",
"start": 367,
"end": 371
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 380,
"end": 383
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 385,
"end": 390
}
}
],
"span": {
"type": "Span",
"start": 385,
"end": 390
}
},
"default": true,
"span": {
"type": "Span",
"start": 378,
"end": 390
}
}
],
"span": {
"type": "Span",
"start": 367,
"end": 391
}
},
"span": {
"type": "Span",
"start": 366,
"end": 392
}
}
],
"span": {
"type": "Span",
"start": 366,
"end": 392
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 336,
"end": 392
}
},
{
"content": "ERROR Message values may not be used as selectors.",
"type": "Comment",
"span": {
"type": "Span",
"start": 394,
"end": 446
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0016",
"arguments": [],
"message": "Message references cannot be used as selectors",
"span": {
"type": "Span",
"start": 481,
"end": 481
}
}
],
"content": "message-reference-selector = {msg ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 447,
"end": 502
}
},
{
"content": "ERROR Term values may not be used as selectors.",
"type": "Comment",
"span": {
"type": "Span",
"start": 502,
"end": 551
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0017",
"arguments": [],
"message": "Terms cannot be used as selectors",
"span": {
"type": "Span",
"start": 585,
"end": 585
}
}
],
"content": "term-reference-selector = {-term ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 552,
"end": 606
}
},
{
"content": "ERROR Function references are invalid outside of call expressions, and this\nparses as a MessageReference which isn't a valid selector.",
"type": "Comment",
"span": {
"type": "Span",
"start": 606,
"end": 744
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0016",
"arguments": [],
"message": "Message references cannot be used as selectors",
"span": {
"type": "Span",
"start": 781,
"end": 781
}
}
],
"content": "function-expression-selector = {FUN ->\n *[key] Value\n}\n",
"span": {
"type": "Span",
"start": 745,
"end": 802
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 802
}
}

View File

@@ -0,0 +1,64 @@
new-messages =
{ BUILTIN() ->
[0] Zero
*[other] {""}Other
}
valid-selector-term-attribute =
{ -term.case ->
*[key] value
}
# ERROR Term values are not valid selectors
invalid-selector-term-value =
{ -term ->
*[key] value
}
# ERROR CallExpressions on Terms are similar to TermReferences
invalid-selector-term-variant =
{ -term(case: "nominative") ->
*[key] value
}
# ERROR Nested expressions are not valid selectors
invalid-selector-nested-expression =
{ { 3 } ->
*[key] default
}
# ERROR Select expressions are not valid selectors
invalid-selector-select-expression =
{ { $sel ->
*[key] value
} ->
*[key] default
}
empty-variant =
{ $sel ->
*[key] {""}
}
reduced-whitespace =
{FOO()->
*[key] {""}
}
nested-select =
{ $sel ->
*[one] { $sel ->
*[two] Value
}
}
# ERROR Missing selector
missing-selector =
{
*[key] Value
}
# ERROR Missing line end after variant list
missing-line-end =
{ $sel ->
*[key] Value}

View File

@@ -0,0 +1,362 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "new-messages"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "FunctionReference",
"id": {
"type": "Identifier",
"name": "BUILTIN"
},
"arguments": {
"type": "CallArguments",
"positional": [],
"named": []
}
},
"variants": [
{
"type": "Variant",
"key": {
"value": "0",
"type": "NumberLiteral"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Zero"
}
]
},
"default": false
},
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "other"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "",
"type": "StringLiteral"
}
},
{
"type": "TextElement",
"value": "Other"
}
]
},
"default": true
}
]
}
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "valid-selector-term-attribute"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term"
},
"attribute": {
"type": "Identifier",
"name": "case"
},
"arguments": null
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "value"
}
]
},
"default": true
}
]
}
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Comment",
"content": "ERROR Term values are not valid selectors"
},
{
"type": "Junk",
"annotations": [],
"content": "invalid-selector-term-value =\n { -term ->\n *[key] value\n }\n\n"
},
{
"type": "Comment",
"content": "ERROR CallExpressions on Terms are similar to TermReferences"
},
{
"type": "Junk",
"annotations": [],
"content": "invalid-selector-term-variant =\n { -term(case: \"nominative\") ->\n *[key] value\n }\n\n"
},
{
"type": "Comment",
"content": "ERROR Nested expressions are not valid selectors"
},
{
"type": "Junk",
"annotations": [],
"content": "invalid-selector-nested-expression =\n { { 3 } ->\n *[key] default\n }\n\n"
},
{
"type": "Comment",
"content": "ERROR Select expressions are not valid selectors"
},
{
"type": "Junk",
"annotations": [],
"content": "invalid-selector-select-expression =\n { { $sel ->\n *[key] value\n } ->\n *[key] default\n }\n\n"
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "empty-variant"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel"
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "",
"type": "StringLiteral"
}
}
]
},
"default": true
}
]
}
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "reduced-whitespace"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "FunctionReference",
"id": {
"type": "Identifier",
"name": "FOO"
},
"arguments": {
"type": "CallArguments",
"positional": [],
"named": []
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "",
"type": "StringLiteral"
}
}
]
},
"default": true
}
]
}
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "nested-select"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel"
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "one"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel"
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "two"
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value"
}
]
},
"default": true
}
]
}
}
]
},
"default": true
}
]
}
}
]
},
"attributes": [],
"comment": null
},
{
"type": "Comment",
"content": "ERROR Missing selector"
},
{
"type": "Junk",
"annotations": [],
"content": "missing-selector =\n {\n *[key] Value\n }\n\n"
},
{
"type": "Comment",
"content": "ERROR Missing line end after variant list"
},
{
"type": "Junk",
"annotations": [],
"content": "missing-line-end =\n { $sel ->\n *[key] Value}\n"
}
]
}

View File

@@ -0,0 +1,96 @@
select-1tbs-inline = { $selector ->
*[key] Value
}
select-1tbs-newline = {
$selector ->
*[key] Value
}
select-1tbs-indent = {
$selector ->
*[key] Value
}
select-allman-inline =
{ $selector ->
*[key] Value
[other] Other
}
select-allman-newline =
{
$selector ->
*[key] Value
}
select-allman-indent =
{
$selector ->
*[key] Value
}
select-gnu-inline =
{ $selector ->
*[key] Value
}
select-gnu-newline =
{
$selector ->
*[key] Value
}
select-gnu-indent =
{
$selector ->
*[key] Value
}
select-no-indent =
{
$selector ->
*[key] Value
[other] Other
}
select-no-indent-multiline =
{
$selector ->
*[key] Value
Continued
[other]
Other
Multiline
}
# ERROR (Multiline text must be indented)
select-no-indent-multiline = { $selector ->
*[key] Value
Continued without indent.
}
select-flat =
{
$selector
->
*[
key
] Value
[
other
] Other
}
# Each line ends with 5 spaces.
select-flat-with-trailing-spaces =
{
$selector
->
*[
key
] Value
[
other
] Other
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,39 @@
key01 =
Value
key02 =
.attr = Attribute
key03 =
Value
Continued
Over multiple
Lines
.attr = Attribute
key05 = Value
key06 = { 1 ->
[one] One
*[two] Two
}

View File

@@ -0,0 +1,348 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 0,
"end": 5
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 14,
"end": 19
}
}
],
"span": {
"type": "Span",
"start": 10,
"end": 19
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 19
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 21,
"end": 26
}
},
"value": null,
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 36,
"end": 40
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 43,
"end": 52
}
}
],
"span": {
"type": "Span",
"start": 43,
"end": 52
}
},
"span": {
"type": "Span",
"start": 35,
"end": 52
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 21,
"end": 52
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 55,
"end": 60
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value\nContinued\n\n\nOver multiple\nLines",
"span": {
"type": "Span",
"start": 67,
"end": 116
}
}
],
"span": {
"type": "Span",
"start": 63,
"end": 116
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 125,
"end": 129
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 132,
"end": 141
}
}
],
"span": {
"type": "Span",
"start": 132,
"end": 141
}
},
"span": {
"type": "Span",
"start": 124,
"end": 141
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 55,
"end": 141
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key05",
"span": {
"type": "Span",
"start": 144,
"end": 149
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 172,
"end": 177
}
}
],
"span": {
"type": "Span",
"start": 172,
"end": 177
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 144,
"end": 177
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key06",
"span": {
"type": "Span",
"start": 179,
"end": 184
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 189,
"end": 190
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "one",
"span": {
"type": "Span",
"start": 206,
"end": 209
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "One",
"span": {
"type": "Span",
"start": 211,
"end": 214
}
}
],
"span": {
"type": "Span",
"start": 211,
"end": 214
}
},
"default": false,
"span": {
"type": "Span",
"start": 205,
"end": 214
}
},
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "two",
"span": {
"type": "Span",
"start": 229,
"end": 232
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Two",
"span": {
"type": "Span",
"start": 234,
"end": 237
}
}
],
"span": {
"type": "Span",
"start": 234,
"end": 237
}
},
"default": true,
"span": {
"type": "Span",
"start": 227,
"end": 237
}
}
],
"span": {
"type": "Span",
"start": 189,
"end": 245
}
},
"span": {
"type": "Span",
"start": 187,
"end": 246
}
}
],
"span": {
"type": "Span",
"start": 187,
"end": 246
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 179,
"end": 246
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 247
}
}

View File

@@ -0,0 +1,14 @@
## OK
bracket-inline = [Value]
dot-inline = .Value
star-inline = *Value
## ERRORS
bracket-newline =
[Value]
dot-newline =
.Value
star-newline =
*Value

View File

@@ -0,0 +1,214 @@
{
"type": "Resource",
"body": [
{
"content": "OK",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 0,
"end": 5
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "bracket-inline",
"span": {
"type": "Span",
"start": 7,
"end": 21
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "[Value]",
"span": {
"type": "Span",
"start": 24,
"end": 31
}
}
],
"span": {
"type": "Span",
"start": 24,
"end": 31
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 7,
"end": 31
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "dot-inline",
"span": {
"type": "Span",
"start": 32,
"end": 42
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": ".Value",
"span": {
"type": "Span",
"start": 45,
"end": 51
}
}
],
"span": {
"type": "Span",
"start": 45,
"end": 51
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 32,
"end": 51
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "star-inline",
"span": {
"type": "Span",
"start": 52,
"end": 63
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "*Value",
"span": {
"type": "Span",
"start": 66,
"end": 72
}
}
],
"span": {
"type": "Span",
"start": 66,
"end": 72
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 52,
"end": 72
}
},
{
"content": "ERRORS",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 74,
"end": 83
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0005",
"arguments": [
"bracket-newline"
],
"message": "Expected message \"bracket-newline\" to have a value or attributes",
"span": {
"type": "Span",
"start": 102,
"end": 102
}
}
],
"content": "bracket-newline =\n [Value]\n",
"span": {
"type": "Span",
"start": 85,
"end": 115
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 139,
"end": 139
}
}
],
"content": "dot-newline =\n .Value\n",
"span": {
"type": "Span",
"start": 115,
"end": 140
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0005",
"arguments": [
"star-newline"
],
"message": "Expected message \"star-newline\" to have a value or attributes",
"span": {
"type": "Span",
"start": 154,
"end": 154
}
}
],
"content": "star-newline =\n *Value\n",
"span": {
"type": "Span",
"start": 140,
"end": 166
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 166
}
}

View File

@@ -0,0 +1,14 @@
# OK (tab after = is part of the value)
key01 = Value 01
# Error (tab before =)
key02 = Value 02
# Error (tab is not a valid indent)
key03 =
This line isn't properly indented.
# Partial Error (tab is not a valid indent)
key04 =
This line is indented by 4 spaces,
whereas this line by 1 tab.

View File

@@ -0,0 +1,190 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 40,
"end": 45
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "\tValue 01",
"span": {
"type": "Span",
"start": 47,
"end": 56
}
}
],
"span": {
"type": "Span",
"start": 47,
"end": 56
}
},
"attributes": [],
"comment": {
"content": "OK (tab after = is part of the value)",
"type": "Comment",
"span": {
"type": "Span",
"start": 0,
"end": 39
}
},
"span": {
"type": "Span",
"start": 0,
"end": 56
}
},
{
"content": "Error (tab before =)",
"type": "Comment",
"span": {
"type": "Span",
"start": 58,
"end": 80
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 86,
"end": 86
}
}
],
"content": "key02\t= Value 02\n\n",
"span": {
"type": "Span",
"start": 81,
"end": 99
}
},
{
"content": "Error (tab is not a valid indent)",
"type": "Comment",
"span": {
"type": "Span",
"start": 99,
"end": 134
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0005",
"arguments": [
"key03"
],
"message": "Expected message \"key03\" to have a value or attributes",
"span": {
"type": "Span",
"start": 142,
"end": 142
}
}
],
"content": "key03 =\n\tThis line isn't properly indented.\n\n",
"span": {
"type": "Span",
"start": 135,
"end": 180
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 224,
"end": 229
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "This line is indented by 4 spaces,",
"span": {
"type": "Span",
"start": 236,
"end": 270
}
}
],
"span": {
"type": "Span",
"start": 232,
"end": 270
}
},
"attributes": [],
"comment": {
"content": "Partial Error (tab is not a valid indent)",
"type": "Comment",
"span": {
"type": "Span",
"start": 180,
"end": 223
}
},
"span": {
"type": "Span",
"start": 180,
"end": 270
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0002",
"arguments": [],
"message": "Expected an entry start",
"span": {
"type": "Span",
"start": 271,
"end": 271
}
}
],
"content": "\twhereas this line by 1 tab.\n",
"span": {
"type": "Span",
"start": 271,
"end": 300
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 300
}
}

View File

@@ -0,0 +1,8 @@
-term = { $arg ->
*[key] Value
}
key01 = { -term }
key02 = { -term () }
key03 = { -term(arg: 1) }
key04 = { -term("positional", narg1: 1, narg2: 2) }

View File

@@ -0,0 +1,452 @@
{
"type": "Resource",
"body": [
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 1,
"end": 5
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "arg",
"span": {
"type": "Span",
"start": 11,
"end": 14
}
},
"span": {
"type": "Span",
"start": 10,
"end": 14
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 23,
"end": 26
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 28,
"end": 33
}
}
],
"span": {
"type": "Span",
"start": 28,
"end": 33
}
},
"default": true,
"span": {
"type": "Span",
"start": 21,
"end": 33
}
}
],
"span": {
"type": "Span",
"start": 10,
"end": 34
}
},
"span": {
"type": "Span",
"start": 8,
"end": 35
}
}
],
"span": {
"type": "Span",
"start": 8,
"end": 35
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 35
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 37,
"end": 42
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 48,
"end": 52
}
},
"attribute": null,
"arguments": null,
"span": {
"type": "Span",
"start": 47,
"end": 52
}
},
"span": {
"type": "Span",
"start": 45,
"end": 54
}
}
],
"span": {
"type": "Span",
"start": 45,
"end": 54
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 37,
"end": 54
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 55,
"end": 60
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 66,
"end": 70
}
},
"attribute": null,
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [],
"span": {
"type": "Span",
"start": 71,
"end": 73
}
},
"span": {
"type": "Span",
"start": 65,
"end": 73
}
},
"span": {
"type": "Span",
"start": 63,
"end": 75
}
}
],
"span": {
"type": "Span",
"start": 63,
"end": 75
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 55,
"end": 75
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 76,
"end": 81
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 87,
"end": 91
}
},
"attribute": null,
"arguments": {
"type": "CallArguments",
"positional": [],
"named": [
{
"type": "NamedArgument",
"name": {
"type": "Identifier",
"name": "arg",
"span": {
"type": "Span",
"start": 92,
"end": 95
}
},
"value": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 97,
"end": 98
}
},
"span": {
"type": "Span",
"start": 92,
"end": 98
}
}
],
"span": {
"type": "Span",
"start": 91,
"end": 99
}
},
"span": {
"type": "Span",
"start": 86,
"end": 99
}
},
"span": {
"type": "Span",
"start": 84,
"end": 101
}
}
],
"span": {
"type": "Span",
"start": 84,
"end": 101
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 76,
"end": 101
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 102,
"end": 107
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "TermReference",
"id": {
"type": "Identifier",
"name": "term",
"span": {
"type": "Span",
"start": 113,
"end": 117
}
},
"attribute": null,
"arguments": {
"type": "CallArguments",
"positional": [
{
"value": "positional",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 118,
"end": 130
}
}
],
"named": [
{
"type": "NamedArgument",
"name": {
"type": "Identifier",
"name": "narg1",
"span": {
"type": "Span",
"start": 132,
"end": 137
}
},
"value": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 139,
"end": 140
}
},
"span": {
"type": "Span",
"start": 132,
"end": 140
}
},
{
"type": "NamedArgument",
"name": {
"type": "Identifier",
"name": "narg2",
"span": {
"type": "Span",
"start": 142,
"end": 147
}
},
"value": {
"value": "2",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 149,
"end": 150
}
},
"span": {
"type": "Span",
"start": 142,
"end": 150
}
}
],
"span": {
"type": "Span",
"start": 117,
"end": 151
}
},
"span": {
"type": "Span",
"start": 112,
"end": 151
}
},
"span": {
"type": "Span",
"start": 110,
"end": 153
}
}
],
"span": {
"type": "Span",
"start": 110,
"end": 153
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 102,
"end": 153
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 154
}
}

View File

@@ -0,0 +1,29 @@
-term01 = Value
.attr = Attribute
-term02 = {""}
# JUNK Missing value
-term03 =
.attr = Attribute
# JUNK Missing value
# < whitespace >
-term04 =
.attr1 = Attribute 1
# JUNK Missing value
-term05 =
# JUNK Missing value
# < whitespace >
-term06 =
# JUNK Missing =
-term07
-term08=Value
.attr=Attribute
-term09 = Value
.attr = Attribute

View File

@@ -0,0 +1,446 @@
{
"type": "Resource",
"body": [
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term01",
"span": {
"type": "Span",
"start": 1,
"end": 7
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 10,
"end": 15
}
}
],
"span": {
"type": "Span",
"start": 10,
"end": 15
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 21,
"end": 25
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 28,
"end": 37
}
}
],
"span": {
"type": "Span",
"start": 28,
"end": 37
}
},
"span": {
"type": "Span",
"start": 20,
"end": 37
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 37
}
},
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term02",
"span": {
"type": "Span",
"start": 40,
"end": 46
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"value": "",
"type": "StringLiteral",
"span": {
"type": "Span",
"start": 50,
"end": 52
}
},
"span": {
"type": "Span",
"start": 49,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 49,
"end": 53
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 39,
"end": 53
}
},
{
"content": "JUNK Missing value",
"type": "Comment",
"span": {
"type": "Span",
"start": 55,
"end": 75
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0006",
"arguments": [
"term03"
],
"message": "Expected term \"-term03\" to have a value",
"span": {
"type": "Span",
"start": 85,
"end": 85
}
}
],
"content": "-term03 =\n .attr = Attribute\n\n",
"span": {
"type": "Span",
"start": 76,
"end": 109
}
},
{
"content": "JUNK Missing value\n < whitespace >",
"type": "Comment",
"span": {
"type": "Span",
"start": 109,
"end": 155
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0006",
"arguments": [
"term04"
],
"message": "Expected term \"-term04\" to have a value",
"span": {
"type": "Span",
"start": 165,
"end": 165
}
}
],
"content": "-term04 = \n .attr1 = Attribute 1\n\n",
"span": {
"type": "Span",
"start": 156,
"end": 208
}
},
{
"content": "JUNK Missing value",
"type": "Comment",
"span": {
"type": "Span",
"start": 208,
"end": 228
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0006",
"arguments": [
"term05"
],
"message": "Expected term \"-term05\" to have a value",
"span": {
"type": "Span",
"start": 238,
"end": 238
}
}
],
"content": "-term05 =\n\n",
"span": {
"type": "Span",
"start": 229,
"end": 240
}
},
{
"content": "JUNK Missing value\n < whitespace >",
"type": "Comment",
"span": {
"type": "Span",
"start": 240,
"end": 286
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0006",
"arguments": [
"term06"
],
"message": "Expected term \"-term06\" to have a value",
"span": {
"type": "Span",
"start": 296,
"end": 296
}
}
],
"content": "-term06 = \n\n",
"span": {
"type": "Span",
"start": 287,
"end": 314
}
},
{
"content": "JUNK Missing =",
"type": "Comment",
"span": {
"type": "Span",
"start": 314,
"end": 330
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"="
],
"message": "Expected token: \"=\"",
"span": {
"type": "Span",
"start": 338,
"end": 338
}
}
],
"content": "-term07\n\n",
"span": {
"type": "Span",
"start": 331,
"end": 340
}
},
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term08",
"span": {
"type": "Span",
"start": 341,
"end": 347
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 348,
"end": 353
}
}
],
"span": {
"type": "Span",
"start": 348,
"end": 353
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 359,
"end": 363
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 364,
"end": 373
}
}
],
"span": {
"type": "Span",
"start": 364,
"end": 373
}
},
"span": {
"type": "Span",
"start": 358,
"end": 373
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 340,
"end": 373
}
},
{
"type": "Term",
"id": {
"type": "Identifier",
"name": "term09",
"span": {
"type": "Span",
"start": 376,
"end": 382
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Value",
"span": {
"type": "Span",
"start": 388,
"end": 393
}
}
],
"span": {
"type": "Span",
"start": 388,
"end": 393
}
},
"attributes": [
{
"type": "Attribute",
"id": {
"type": "Identifier",
"name": "attr",
"span": {
"type": "Span",
"start": 399,
"end": 403
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "Attribute",
"span": {
"type": "Span",
"start": 409,
"end": 418
}
}
],
"span": {
"type": "Span",
"start": 409,
"end": 418
}
},
"span": {
"type": "Span",
"start": 398,
"end": 418
}
}
],
"comment": null,
"span": {
"type": "Span",
"start": 375,
"end": 418
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 419
}
}

View File

@@ -0,0 +1,17 @@
key01 = {$var}
key02 = { $var }
key03 = {
$var
}
key04 = {
$var}
## Errors
# ERROR Missing variable identifier
err01 = {$}
# ERROR Double $$
err02 = {$$var}
# ERROR Invalid first char of the identifier
err03 = {$-var}

View File

@@ -0,0 +1,334 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key01",
"span": {
"type": "Span",
"start": 0,
"end": 5
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 10,
"end": 13
}
},
"span": {
"type": "Span",
"start": 9,
"end": 13
}
},
"span": {
"type": "Span",
"start": 8,
"end": 14
}
}
],
"span": {
"type": "Span",
"start": 8,
"end": 14
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 14
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key02",
"span": {
"type": "Span",
"start": 15,
"end": 20
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 28,
"end": 31
}
},
"span": {
"type": "Span",
"start": 27,
"end": 31
}
},
"span": {
"type": "Span",
"start": 23,
"end": 35
}
}
],
"span": {
"type": "Span",
"start": 23,
"end": 35
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 15,
"end": 35
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key03",
"span": {
"type": "Span",
"start": 36,
"end": 41
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 51,
"end": 54
}
},
"span": {
"type": "Span",
"start": 50,
"end": 54
}
},
"span": {
"type": "Span",
"start": 44,
"end": 56
}
}
],
"span": {
"type": "Span",
"start": 44,
"end": 56
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 36,
"end": 56
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key04",
"span": {
"type": "Span",
"start": 57,
"end": 62
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "var",
"span": {
"type": "Span",
"start": 68,
"end": 71
}
},
"span": {
"type": "Span",
"start": 67,
"end": 71
}
},
"span": {
"type": "Span",
"start": 65,
"end": 72
}
}
],
"span": {
"type": "Span",
"start": 65,
"end": 72
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 57,
"end": 72
}
},
{
"content": "Errors",
"type": "GroupComment",
"span": {
"type": "Span",
"start": 75,
"end": 84
}
},
{
"content": "ERROR Missing variable identifier",
"type": "Comment",
"span": {
"type": "Span",
"start": 86,
"end": 121
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0004",
"arguments": [
"a-zA-Z"
],
"message": "Expected a character from range: \"a-zA-Z\"",
"span": {
"type": "Span",
"start": 132,
"end": 132
}
}
],
"content": "err01 = {$}\n",
"span": {
"type": "Span",
"start": 122,
"end": 134
}
},
{
"content": "ERROR Double $$",
"type": "Comment",
"span": {
"type": "Span",
"start": 134,
"end": 151
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0004",
"arguments": [
"a-zA-Z"
],
"message": "Expected a character from range: \"a-zA-Z\"",
"span": {
"type": "Span",
"start": 162,
"end": 162
}
}
],
"content": "err02 = {$$var}\n",
"span": {
"type": "Span",
"start": 152,
"end": 168
}
},
{
"content": "ERROR Invalid first char of the identifier",
"type": "Comment",
"span": {
"type": "Span",
"start": 168,
"end": 212
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0004",
"arguments": [
"a-zA-Z"
],
"message": "Expected a character from range: \"a-zA-Z\"",
"span": {
"type": "Span",
"start": 223,
"end": 223
}
}
],
"content": "err03 = {$-var}\n",
"span": {
"type": "Span",
"start": 213,
"end": 229
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 229
}
}

View File

@@ -0,0 +1,37 @@
simple-identifier =
{ $sel ->
*[key] value
}
identifier-surrounded-by-whitespace =
{ $sel ->
*[ key ] value
}
int-number =
{ $sel ->
*[1] value
}
float-number =
{ $sel ->
*[3.14] value
}
# ERROR
invalid-identifier =
{ $sel ->
*[two words] value
}
# ERROR
invalid-int =
{ $sel ->
*[1 apple] value
}
# ERROR
invalid-int =
{ $sel ->
*[3.14 apples] value
}

View File

@@ -0,0 +1,513 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "simple-identifier",
"span": {
"type": "Span",
"start": 0,
"end": 17
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel",
"span": {
"type": "Span",
"start": 27,
"end": 30
}
},
"span": {
"type": "Span",
"start": 26,
"end": 30
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 43,
"end": 46
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "value",
"span": {
"type": "Span",
"start": 48,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 48,
"end": 53
}
},
"default": true,
"span": {
"type": "Span",
"start": 41,
"end": 53
}
}
],
"span": {
"type": "Span",
"start": 26,
"end": 58
}
},
"span": {
"type": "Span",
"start": 24,
"end": 59
}
}
],
"span": {
"type": "Span",
"start": 20,
"end": 59
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 0,
"end": 59
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "identifier-surrounded-by-whitespace",
"span": {
"type": "Span",
"start": 61,
"end": 96
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel",
"span": {
"type": "Span",
"start": 106,
"end": 109
}
},
"span": {
"type": "Span",
"start": 105,
"end": 109
}
},
"variants": [
{
"type": "Variant",
"key": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 127,
"end": 130
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "value",
"span": {
"type": "Span",
"start": 137,
"end": 142
}
}
],
"span": {
"type": "Span",
"start": 137,
"end": 142
}
},
"default": true,
"span": {
"type": "Span",
"start": 120,
"end": 142
}
}
],
"span": {
"type": "Span",
"start": 105,
"end": 147
}
},
"span": {
"type": "Span",
"start": 103,
"end": 148
}
}
],
"span": {
"type": "Span",
"start": 99,
"end": 148
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 61,
"end": 148
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "int-number",
"span": {
"type": "Span",
"start": 150,
"end": 160
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel",
"span": {
"type": "Span",
"start": 170,
"end": 173
}
},
"span": {
"type": "Span",
"start": 169,
"end": 173
}
},
"variants": [
{
"type": "Variant",
"key": {
"value": "1",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 186,
"end": 187
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "value",
"span": {
"type": "Span",
"start": 189,
"end": 194
}
}
],
"span": {
"type": "Span",
"start": 189,
"end": 194
}
},
"default": true,
"span": {
"type": "Span",
"start": 184,
"end": 194
}
}
],
"span": {
"type": "Span",
"start": 169,
"end": 199
}
},
"span": {
"type": "Span",
"start": 167,
"end": 200
}
}
],
"span": {
"type": "Span",
"start": 163,
"end": 200
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 150,
"end": 200
}
},
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "float-number",
"span": {
"type": "Span",
"start": 202,
"end": 214
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "Placeable",
"expression": {
"type": "SelectExpression",
"selector": {
"type": "VariableReference",
"id": {
"type": "Identifier",
"name": "sel",
"span": {
"type": "Span",
"start": 224,
"end": 227
}
},
"span": {
"type": "Span",
"start": 223,
"end": 227
}
},
"variants": [
{
"type": "Variant",
"key": {
"value": "3.14",
"type": "NumberLiteral",
"span": {
"type": "Span",
"start": 240,
"end": 244
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "value",
"span": {
"type": "Span",
"start": 246,
"end": 251
}
}
],
"span": {
"type": "Span",
"start": 246,
"end": 251
}
},
"default": true,
"span": {
"type": "Span",
"start": 238,
"end": 251
}
}
],
"span": {
"type": "Span",
"start": 223,
"end": 256
}
},
"span": {
"type": "Span",
"start": 221,
"end": 257
}
}
],
"span": {
"type": "Span",
"start": 217,
"end": 257
}
},
"attributes": [],
"comment": null,
"span": {
"type": "Span",
"start": 202,
"end": 257
}
},
{
"content": "ERROR",
"type": "Comment",
"span": {
"type": "Span",
"start": 259,
"end": 266
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"]"
],
"message": "Expected token: \"]\"",
"span": {
"type": "Span",
"start": 315,
"end": 315
}
}
],
"content": "invalid-identifier =\n { $sel ->\n *[two words] value\n }\n\n",
"span": {
"type": "Span",
"start": 267,
"end": 335
}
},
{
"content": "ERROR",
"type": "Comment",
"span": {
"type": "Span",
"start": 335,
"end": 342
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"]"
],
"message": "Expected token: \"]\"",
"span": {
"type": "Span",
"start": 382,
"end": 382
}
}
],
"content": "invalid-int =\n { $sel ->\n *[1 apple] value\n }\n\n",
"span": {
"type": "Span",
"start": 343,
"end": 402
}
},
{
"content": "ERROR",
"type": "Comment",
"span": {
"type": "Span",
"start": 402,
"end": 409
}
},
{
"type": "Junk",
"annotations": [
{
"type": "Annotation",
"code": "E0003",
"arguments": [
"]"
],
"message": "Expected token: \"]\"",
"span": {
"type": "Span",
"start": 452,
"end": 452
}
}
],
"content": "invalid-int =\n { $sel ->\n *[3.14 apples] value\n }\n",
"span": {
"type": "Span",
"start": 410,
"end": 472
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 472
}
}

View File

@@ -0,0 +1,10 @@
# Caution, lines 6 and 7 contain white-space-only lines
key =
first line
last line

View File

@@ -0,0 +1,56 @@
{
"type": "Resource",
"body": [
{
"type": "Message",
"id": {
"type": "Identifier",
"name": "key",
"span": {
"type": "Span",
"start": 56,
"end": 59
}
},
"value": {
"type": "Pattern",
"elements": [
{
"type": "TextElement",
"value": "first line\n\n\n\n\n\n\nlast line",
"span": {
"type": "Span",
"start": 64,
"end": 96
}
}
],
"span": {
"type": "Span",
"start": 62,
"end": 96
}
},
"attributes": [],
"comment": {
"content": "Caution, lines 6 and 7 contain white-space-only lines",
"type": "Comment",
"span": {
"type": "Span",
"start": 0,
"end": 55
}
},
"span": {
"type": "Span",
"start": 0,
"end": 96
}
}
],
"span": {
"type": "Span",
"start": 0,
"end": 97
}
}

View File

@@ -0,0 +1,9 @@
{
"type": "Resource",
"body": [],
"span": {
"type": "Span",
"start": 0,
"end": 0
}
}