Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 63 additions & 19 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,10 @@ module.exports = grammar({
for namelist in explist do block end |
function funcname funcbody |
local function Name funcbody |
local namelist ['=' explist]
global function Name funcbody |
local attnamelist ['=' explist] |
global attnamelist ['=' explist] |
global [attrib] ‘*’
*/
statement: ($) =>
choice(
Expand All @@ -99,7 +102,7 @@ module.exports = grammar({
$.repeat_statement,
$.if_statement,
$.for_statement,
$.declaration
$.declaration,
),

// retstat ::= return [explist] [';']
Expand Down Expand Up @@ -207,25 +210,45 @@ module.exports = grammar({
field('end', $.expression),
optional(seq(',', field('step', $.expression)))
),
// namelist ::= Name {',' Name}
_name_list: ($) => name_list($),

// function funcname funcbody
// local function Name funcbody
// local namelist ['=' explist]
// global function Name funcbody
// local attnamelist [‘=’ explist]
// global attnamelist [‘=’ explist]
// global [attrib] ‘*’
declaration: ($) =>
choice(
$.function_declaration,
field(
'local_declaration',
alias($._local_function_declaration, $.function_declaration)
),
field('local_declaration', $.variable_declaration)
field('local_declaration', $.variable_declaration),
field(
'global_declaration',
alias($._global_function_declaration, $.function_declaration)
),
field(
'global_declaration',
alias($._global_variable_declaration, $.variable_declaration)
),
field(
'global_declaration',
alias($._global_implicit_variable_declaration, $.implicit_variable_declaration)
)
),
// function funcname funcbody
function_declaration: ($) =>
seq('function', field('name', $._function_name), $._function_body),
// local function Name funcbody
_local_function_declaration: ($) =>
seq('local', 'function', field('name', $.identifier), $._function_body),
// global function Name funcbody
_global_function_declaration: ($) =>
seq('global', 'function', field('name', $.identifier), $._function_body),
// funcname ::= Name {'.' Name} [':' Name]
_function_name: ($) =>
choice(
Expand Down Expand Up @@ -253,34 +276,52 @@ module.exports = grammar({
field('method', $.identifier)
),

// local namelist ['=' explist]
// local attnamelist [‘=’ explist]
variable_declaration: ($) =>
seq(
'local',
choice(
alias($._att_name_list, $.variable_list),
alias($._local_variable_assignment, $.assignment_statement)
alias($._variable_assignment, $.assignment_statement)
)
),
_local_variable_assignment: ($) =>
// global attnamelist [‘=’ explist]
_global_variable_declaration: ($) =>
seq(
'global',
choice(
alias($._att_name_list, $.variable_list),
alias($._variable_assignment, $.assignment_statement),
)
),
// attnamelist ‘=’ explist
_variable_assignment: ($) =>
seq(
alias($._att_name_list, $.variable_list),
'=',
alias($._variable_assignment_explist, $.expression_list)
),
// namelist ::= Name {',' Name}
_name_list: ($) => name_list($),

// attnamelist ::= Name attrib {‘,’ Name attrib}
// attnamelist ::= [attrib] Name [attrib] {‘,’ Name [attrib]}
_att_name_list: ($) =>
list_seq(
seq(
field('name', $.identifier),
optional(field('attribute', alias($._attrib, $.attribute)))
seq(
optional(field('attribute', alias($._attrib, $.attribute))),
list_seq(
seq(
field('name', $.identifier),
optional(field('attribute', alias($._attrib, $.attribute)))
),
','
),
','
),
// attrib ::= [‘<’ Name ‘>’]
// global [attrib] ‘*’
_global_implicit_variable_declaration: ($) =>
seq(
'global',
optional(field('attribute', alias($._attrib, $.attribute))),
'*'
),
// attrib ::= ‘<’ Name ‘>’
_attrib: ($) => seq('<', $.identifier, '>'),

// explist ::= exp {',' exp}
Expand Down Expand Up @@ -429,12 +470,15 @@ module.exports = grammar({
),
// '(' [parlist] ')'
parameters: ($) => seq('(', optional($._parameter_list), ')'),
// parlist ::= namelist [',' '...'] | '...'
// parlist ::= namelist [‘,’ varargparam] | varargparam
_parameter_list: ($) =>
choice(
seq(name_list($), optional(seq(',', $.vararg_expression))),
$.vararg_expression
seq(name_list($), optional(seq(',', $._vararg_parameter))),
$._vararg_parameter
),
// varargparam ::= ‘...’ [Name]
_vararg_parameter: ($) =>
seq($.vararg_expression, optional(field('name', $.identifier))),

// prefixexp ::= var | functioncall | '(' exp ')'
_prefix_expression: ($) =>
Expand Down
1 change: 1 addition & 0 deletions queries/highlights.scm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"goto"
"in"
"local"
"global"
] @keyword

(label_statement) @label
Expand Down
7 changes: 7 additions & 0 deletions queries/locals.scm
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
(function_declaration
name: (identifier) @local.definition)

(global_variable_declaration
(variable_list
(identifier) @local.definition))

(for_generic_clause
(variable_list
(identifier) @local.definition))
Expand All @@ -29,6 +33,9 @@

(parameters (identifier) @local.definition)

(named_vararg
name: (identifier) @local.definition)

; References

[
Expand Down
Loading