Add comments

For now it only supports non-nested comments. It seems like I *will*
need to write an external lexer to account for nesting properly.
This commit is contained in:
Bruno BELANYI 2022-06-02 11:03:55 +02:00
parent e5e958cac9
commit 75bb2c7009
5 changed files with 2239 additions and 1718 deletions

View file

@ -25,12 +25,32 @@ module.exports = grammar({
[$._lvalue, $.array_expression], [$._lvalue, $.array_expression],
], ],
extras: ($) => [
/( |\n|\r|\t)+/,
$.comment,
],
rules: { rules: {
source_file: ($) => choice( source_file: ($) => choice(
$._expr, $._expr,
optional($._declaration_chunks), optional($._declaration_chunks),
), ),
comment: ($) => token(
seq(
"/*",
repeat(
choice(
// Match anything but the end-delimiter
/(\*[^/]|[^*])+/,
// Comments can be nested
// $.comment,
),
),
"*/",
),
),
// Expressions {{{ // Expressions {{{
_expr: ($) => choice( _expr: ($) => choice(

View file

@ -23,6 +23,34 @@
} }
] ]
}, },
"comment": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "/*"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "(\\*[^/]|[^*])+"
}
]
}
},
{
"type": "STRING",
"value": "*/"
}
]
}
},
"_expr": { "_expr": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -1426,7 +1454,11 @@
"extras": [ "extras": [
{ {
"type": "PATTERN", "type": "PATTERN",
"value": "\\s" "value": "( |\\n|\\r|\\t)+"
},
{
"type": "SYMBOL",
"name": "comment"
} }
], ],
"conflicts": [ "conflicts": [

View file

@ -2283,6 +2283,10 @@
"type": "break_expression", "type": "break_expression",
"named": true "named": true
}, },
{
"type": "comment",
"named": true
},
{ {
"type": "do", "type": "do",
"named": false "named": false

File diff suppressed because it is too large Load diff

86
test/corpus/comments.txt Normal file
View file

@ -0,0 +1,86 @@
================================================================================
Empty comment
================================================================================
/**/
--------------------------------------------------------------------------------
(source_file
(comment))
================================================================================
Whitespace comment
================================================================================
/* */
--------------------------------------------------------------------------------
(source_file
(comment))
================================================================================
Comment
================================================================================
/* This is a comment */
--------------------------------------------------------------------------------
(source_file
(comment))
================================================================================
Comment with slashes
================================================================================
/* /// */
--------------------------------------------------------------------------------
(source_file
(comment))
================================================================================
Nested comment
================================================================================
/* This is /* a /* nested */ comment */*/
--------------------------------------------------------------------------------
(source_file
(comment)
(identifier)
(ERROR
(operator)
(operator)
(operator)
(operator)))
================================================================================
Unterminated comment
================================================================================
/*
--------------------------------------------------------------------------------
(source_file
(ERROR
(operator)
(operator)))
================================================================================
Comment end-delimiter only
================================================================================
*/
--------------------------------------------------------------------------------
(source_file
(ERROR
(operator)
(operator)))