Add lvalue expressions
This commit is contained in:
parent
8921953bbb
commit
6a3e4663ed
25
grammar.js
25
grammar.js
|
@ -20,6 +20,10 @@ module.exports = grammar({
|
|||
// Ensure we don't extract keywords from tokens
|
||||
word: ($) => $.identifier,
|
||||
|
||||
conflicts: ($) => [
|
||||
[$._lvalue, $.array_expression],
|
||||
],
|
||||
|
||||
rules: {
|
||||
source_file: ($) => choice(
|
||||
$._expr,
|
||||
|
@ -33,6 +37,8 @@ module.exports = grammar({
|
|||
$.array_expression,
|
||||
$.record_expression,
|
||||
|
||||
$._lvalue,
|
||||
|
||||
$.function_call,
|
||||
|
||||
$.unary_expression,
|
||||
|
@ -69,6 +75,25 @@ module.exports = grammar({
|
|||
)
|
||||
),
|
||||
|
||||
_lvalue: ($) => choice(
|
||||
$.identifier,
|
||||
$.record_value,
|
||||
$.array_value,
|
||||
),
|
||||
|
||||
record_value: ($) => seq(
|
||||
field("record", $._lvalue),
|
||||
".",
|
||||
field("field", $.identifier),
|
||||
),
|
||||
|
||||
array_value: ($) => seq(
|
||||
field("array", $._lvalue),
|
||||
"[",
|
||||
field("index", $._expr),
|
||||
"]",
|
||||
),
|
||||
|
||||
function_call: ($) => seq(
|
||||
field("function", $.identifier),
|
||||
"(",
|
||||
|
|
|
@ -34,6 +34,10 @@
|
|||
"type": "SYMBOL",
|
||||
"name": "record_expression"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "_lvalue"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "function_call"
|
||||
|
@ -173,6 +177,77 @@
|
|||
]
|
||||
}
|
||||
},
|
||||
"_lvalue": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "record_value"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "array_value"
|
||||
}
|
||||
]
|
||||
},
|
||||
"record_value": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "record",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_lvalue"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "."
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "field",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"array_value": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "array",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_lvalue"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "["
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "index",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "_expr"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "]"
|
||||
}
|
||||
]
|
||||
},
|
||||
"function_call": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
|
@ -685,7 +760,12 @@
|
|||
"value": "\\s"
|
||||
}
|
||||
],
|
||||
"conflicts": [],
|
||||
"conflicts": [
|
||||
[
|
||||
"_lvalue",
|
||||
"array_expression"
|
||||
]
|
||||
],
|
||||
"precedences": [],
|
||||
"externals": [],
|
||||
"inline": [],
|
||||
|
|
|
@ -11,6 +11,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -19,6 +23,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -31,6 +39,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -53,6 +65,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -61,6 +77,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -73,6 +93,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -100,10 +124,28 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"type": "array_value",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"left": {
|
||||
"array": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"index": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
|
@ -111,6 +153,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -119,6 +165,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -131,6 +181,70 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "string_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "unary_expression",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"left": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "nil_literal",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -163,6 +277,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -171,6 +289,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -183,6 +305,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -215,6 +341,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -223,6 +353,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -235,6 +369,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -283,6 +421,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -291,6 +433,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -303,6 +449,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -329,6 +479,40 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"field": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"record": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true,
|
||||
|
@ -341,6 +525,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -349,6 +537,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -361,6 +553,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -388,6 +584,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -396,6 +596,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -408,6 +612,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -450,6 +658,10 @@
|
|||
"type": "array_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "array_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "binary_expression",
|
||||
"named": true
|
||||
|
@ -458,6 +670,10 @@
|
|||
"type": "function_call",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "integer_literal",
|
||||
"named": true
|
||||
|
@ -470,6 +686,10 @@
|
|||
"type": "record_expression",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "record_value",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sequence_expression",
|
||||
"named": true
|
||||
|
@ -512,6 +732,10 @@
|
|||
"type": ",",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": ".",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": ";",
|
||||
"named": false
|
||||
|
|
2563
src/parser.c
2563
src/parser.c
File diff suppressed because it is too large
Load diff
|
@ -6,7 +6,7 @@ _main
|
|||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(ERROR
|
||||
(source_file
|
||||
(identifier))
|
||||
|
||||
================================================================================
|
||||
|
@ -17,5 +17,5 @@ my_1st_variable
|
|||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(ERROR
|
||||
(source_file
|
||||
(identifier))
|
||||
|
|
36
test/corpus/lvalues.txt
Normal file
36
test/corpus/lvalues.txt
Normal file
|
@ -0,0 +1,36 @@
|
|||
================================================================================
|
||||
Variable
|
||||
================================================================================
|
||||
|
||||
a_variable
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(source_file
|
||||
(identifier))
|
||||
|
||||
================================================================================
|
||||
Array indexing
|
||||
================================================================================
|
||||
|
||||
an_array[12]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(source_file
|
||||
(array_value
|
||||
array: (identifier)
|
||||
index: (integer_literal)))
|
||||
|
||||
================================================================================
|
||||
Record field
|
||||
================================================================================
|
||||
|
||||
a_record.field
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(source_file
|
||||
(record_value
|
||||
record: (identifier)
|
||||
field: (identifier)))
|
Loading…
Reference in a new issue