Browse Source

Handle __attribute__ in function declaration (#19)

* Handle __attribute__ in function declaration

* Fix tests in examples/

* Remove useless optional
pull/22/head
calixteman 7 years ago
committed by Max Brunsfeld
parent
commit
fb9fbd83f0
4 changed files with 59977 additions and 59120 deletions
  1. +38
    -0
      corpus/declarations.txt
  2. +14
    -3
      grammar.js
  3. +41
    -0
      src/grammar.json
  4. +59884
    -59117
      src/parser.c

+ 38
- 0
corpus/declarations.txt View File

@ -362,3 +362,41 @@ int main() {
(compound_statement
(declaration (primitive_type) (array_declarator (identifier) (identifier)))
(declaration (primitive_type) (array_declarator (identifier))))))
================================
Attributes
================================
extern __attribute__((visibility("hidden"))) int foo();
extern int bar() __attribute__((const));
void die(const char *format, ...) __attribute__((noreturn))
__attribute__((format(printf,1,2)));
extern __attribute__((visibility("default"), weak)) int print_status();
---
(translation_unit
(declaration
(storage_class_specifier)
(attribute_specifier
(argument_list
(call_expression
(identifier) (argument_list (string_literal)))))
(primitive_type)
(function_declarator (identifier) (parameter_list)))
(declaration
(storage_class_specifier)
(primitive_type)
(function_declarator (identifier) (parameter_list) (attribute_specifier (argument_list (identifier)))))
(declaration
(primitive_type)
(function_declarator (identifier)
(parameter_list (parameter_declaration (type_qualifier) (primitive_type) (pointer_declarator (identifier))))
(attribute_specifier (argument_list (identifier)))
(attribute_specifier
(argument_list (call_expression (identifier) (argument_list (identifier) (number_literal) (number_literal)))))))
(declaration
(storage_class_specifier)
(attribute_specifier
(argument_list (call_expression (identifier) (argument_list (string_literal))) (identifier)))
(primitive_type) (function_declarator (identifier) (parameter_list))))

+ 14
- 3
grammar.js View File

@ -132,12 +132,14 @@ module.exports = grammar({
_declaration_specifiers: $ => seq(
repeat(choice(
$.storage_class_specifier,
$.type_qualifier
$.type_qualifier,
$.attribute_specifier
)),
$._type_specifier,
repeat(choice(
$.storage_class_specifier,
$.type_qualifier
$.type_qualifier,
$.attribute_specifier
))
),
@ -151,6 +153,15 @@ module.exports = grammar({
)
),
attribute_specifier: $ => seq(
'__attribute__',
seq(
'(',
$.argument_list,
')'
)
),
declaration_list: $ => seq(
'{',
repeat($._top_level_item),
@ -193,7 +204,7 @@ module.exports = grammar({
pointer_type_declarator: $ => prec.dynamic(1, prec.right(seq('*', repeat($.type_qualifier), $._type_declarator))),
abstract_pointer_declarator: $ => prec.dynamic(1, prec.right(seq('*', repeat($.type_qualifier), optional($._abstract_declarator)))),
function_declarator: $ => prec(1, seq($._declarator, $.parameter_list)),
function_declarator: $ => prec(1, seq($._declarator, $.parameter_list, repeat($.attribute_specifier))),
function_field_declarator: $ => prec(1, seq($._field_declarator, $.parameter_list)),
function_type_declarator: $ => prec(1, seq($._type_declarator, $.parameter_list)),
abstract_function_declarator: $ => prec(1, seq(optional($._abstract_declarator), $.parameter_list)),

+ 41
- 0
src/grammar.json View File

@ -820,6 +820,10 @@
{
"type": "SYMBOL",
"name": "type_qualifier"
},
{
"type": "SYMBOL",
"name": "attribute_specifier"
}
]
}
@ -840,6 +844,10 @@
{
"type": "SYMBOL",
"name": "type_qualifier"
},
{
"type": "SYMBOL",
"name": "attribute_specifier"
}
]
}
@ -876,6 +884,32 @@
}
]
},
"attribute_specifier": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "__attribute__"
},
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SYMBOL",
"name": "argument_list"
},
{
"type": "STRING",
"value": ")"
}
]
}
]
},
"declaration_list": {
"type": "SEQ",
"members": [
@ -1223,6 +1257,13 @@
{
"type": "SYMBOL",
"name": "parameter_list"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "attribute_specifier"
}
}
]
}

+ 59884
- 59117
src/parser.c
File diff suppressed because it is too large
View File


Loading…
Cancel
Save