1

refac: fluent.syntax -> fluent-syntax

This commit is contained in:
2025-07-21 16:45:21 +03:00
parent 8dd80fb012
commit 2f142d6da3
323 changed files with 4 additions and 4 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
}
}

View File

@@ -0,0 +1,2 @@
foo =
.attr = Foo Attr

View File

@@ -0,0 +1 @@
foo = \{ placeable }

View File

@@ -0,0 +1,3 @@
foo =
Foo
Bar

View File

@@ -0,0 +1 @@
foo = { FOO() }

View File

@@ -0,0 +1 @@
foo = { FOO(bar) }

View File

@@ -0,0 +1 @@
foo = { FOO(bar: 1) }

View File

@@ -0,0 +1 @@
foo = { FOO(bar: "bar") }

View File

@@ -0,0 +1 @@
foo = { FOO(1) }

View File

@@ -0,0 +1 @@
foo = { FOO(bar, 1, baz: "baz") }

View File

@@ -0,0 +1 @@
foo = { FOO("bar") }

View File

@@ -0,0 +1 @@
foo = { FOO(bar: "bar", baz: "baz") }

View File

@@ -0,0 +1 @@
foo = { FOO(bar, baz) }

View File

@@ -0,0 +1 @@
foo = { FOO($bar) }

View File

@@ -0,0 +1 @@
foo = { "Escaped \" quote" }

View File

@@ -0,0 +1,8 @@
foo = Foo
## Comment Header
##
## A multiline
## group comment
bar = Bar

View File

@@ -0,0 +1,3 @@
foo =
Foo
Bar

View File

@@ -0,0 +1,2 @@
foo = Foo
Bar

View File

@@ -0,0 +1 @@
foo = Foo { bar.baz }

View File

@@ -0,0 +1,3 @@
# A multiline
# message comment.
foo = Foo

View File

@@ -0,0 +1 @@
foo = Foo { bar }

View File

@@ -0,0 +1,9 @@
# Attached comment
key1 = Value1
key2 = Value2
key3 = Value3
# Some comment
key4 = Value4

View File

@@ -0,0 +1 @@
foo = Foo

View File

@@ -0,0 +1 @@
foo = Foo

View File

@@ -0,0 +1,4 @@
foo =
.attr =
Foo Attr
Continued

View File

@@ -0,0 +1,3 @@
foo =
Foo
Baz

View File

@@ -0,0 +1,2 @@
foo = Foo
Baz

Some files were not shown because too many files have changed in this diff Show More