Sfoglia il codice sorgente

Make case statements contain all subsequent statements until the next case

pull/16/merge
Max Brunsfeld 7 anni fa
parent
commit
2af332790e
4 ha cambiato i file con 51762 aggiunte e 50260 eliminazioni
  1. +43
    -0
      corpus/statements.txt
  2. +11
    -6
      grammar.js
  3. +79
    -42
      src/grammar.json
  4. +51629
    -50212
      src/parser.c

+ 43
- 0
corpus/statements.txt Vedi File

@ -110,6 +110,49 @@ recur:
(call_expression (field_expression (identifier) (field_identifier)) (argument_list)))))
(if_statement (parenthesized_expression (identifier)) (goto_statement (statement_identifier))))))
============================================
Switch statements
============================================
void foo(int a) {
switch (a) {
puts("entered switch!");
case 3:
case 5:
if (b) {
c();
}
break;
default:
c();
break;
}
}
---
(translation_unit
(function_definition
(primitive_type)
(function_declarator (identifier) (parameter_list
(parameter_declaration (primitive_type) (identifier))))
(compound_statement
(switch_statement
(parenthesized_expression (identifier))
(compound_statement
(expression_statement (call_expression (identifier) (argument_list (string_literal))))
(case_statement (number_literal))
(case_statement (number_literal)
(if_statement
(parenthesized_expression (identifier))
(compound_statement (expression_statement (call_expression (identifier) (argument_list)))))
(break_statement))
(case_statement
(expression_statement (call_expression (identifier) (argument_list)))
(break_statement)))))))
============================================
Comments with asterisks
============================================

+ 11
- 6
grammar.js Vedi File

@ -392,7 +392,6 @@ module.exports = grammar({
$.expression_statement,
$.if_statement,
$.switch_statement,
$.case_statement,
$.do_statement,
$.while_statement,
$.for_statement,
@ -429,21 +428,27 @@ module.exports = grammar({
switch_statement: $ => seq(
'switch',
$.parenthesized_expression,
$._statement
alias($.switch_body, $.compound_statement)
),
switch_body: $ => seq(
'{',
repeat(choice($.case_statement, $._statement)),
'}'
),
case_statement: $ => seq(
case_statement: $ => prec.right(seq(
choice(
seq('case', $._expression),
'default'
),
':',
choice(
repeat(choice(
$._statement,
$.declaration,
$.type_definition
)
),
))
)),
while_statement: $ => seq(
'while',

+ 79
- 42
src/grammar.json Vedi File

@ -2469,10 +2469,6 @@
"type": "SYMBOL",
"name": "switch_statement"
},
{
"type": "SYMBOL",
"name": "case_statement"
},
{
"type": "SYMBOL",
"name": "do_statement"
@ -2604,58 +2600,99 @@
"name": "parenthesized_expression"
},
{
"type": "SYMBOL",
"name": "_statement"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "switch_body"
},
"named": true,
"value": "compound_statement"
}
]
},
"case_statement": {
"switch_body": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"type": "STRING",
"value": "{"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "case_statement"
},
{
"type": "SYMBOL",
"name": "_statement"
}
]
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"case_statement": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "case"
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
},
{
"type": "STRING",
"value": "default"
}
]
},
{
"type": "STRING",
"value": ":"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "case"
"type": "SYMBOL",
"name": "_statement"
},
{
"type": "SYMBOL",
"name": "_expression"
"name": "declaration"
},
{
"type": "SYMBOL",
"name": "type_definition"
}
]
},
{
"type": "STRING",
"value": "default"
}
]
},
{
"type": "STRING",
"value": ":"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_statement"
},
{
"type": "SYMBOL",
"name": "declaration"
},
{
"type": "SYMBOL",
"name": "type_definition"
}
]
}
]
}
]
}
},
"while_statement": {
"type": "SEQ",

+ 51629
- 50212
src/parser.c
File diff soppresso perché troppo grande
Vedi File


Caricamento…
Annulla
Salva