freebsd-ports/lang/ptoc/files/patch-parser.y
Sergey A. Osokin 4c52f6c933 Update to 3.54.
Utilize ${DOCSDIR} and ${EXAMPLESDIR}.
Use new name schema for patch files.
Fix ${MASTER_SITES} and home page URL.
Take maintainership.
2003-09-24 13:32:25 +00:00

477 lines
13 KiB
Text

--- parser.y.orig Mon Mar 26 10:02:40 2001
+++ parser.y Wed Sep 17 13:34:05 2003
@@ -3,11 +3,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#if defined(__DECCXX) || defined(__GNUC__)
-#include <alloca.h>
-#else
-#include <malloc.h>
-#endif
#include "nmtbl.h"
#include "token.h"
@@ -285,23 +280,27 @@
$2->attrib(ctx_program);
$2->translate(ctx_program);
}
+;
input_file: program | module | unit
+ ;
program: block '.' { $$ = new program_node(NULL, NULL, NULL, NULL, $1, $2); }
| PROGRAM IDENT prog_param_list ';' block '.'
{
$$ = new program_node($1, $2, $3, $4, $5, $6);
}
+;
progend: { $$ = NULL; } | '.'
+;
module: decl_part_list { $$ = new module_node(NULL, NULL, NULL, NULL, $1, NULL); }
| PROGRAM IDENT prog_param_list ';' decl_part_list progend
{
$$ = new module_node($1, $2, $3, $4, $5, $6);
}
-
+;
/* Turbo Pascal specific */
@@ -313,38 +312,46 @@
{ $$ = new unit_node(NULL, NULL, NULL, $1, $2, $3, $4, NULL, $5, $6); }
| INTERFACE unit_decl_list IMPLEMENTATION unit_def_list compoundst '.'
{ $$ = new unit_node(NULL, NULL, NULL, $1, $2, $3, $4, $5, NULL, $6); }
+ ;
unit_def_list: decl_part_list
-
+ ;
prog_param_list: { $$ = NULL; }
| '(' ident_list ')' { $$ = new import_list_node($1, $2, $3); }
+ ;
ident_list: IDENT ',' ident_list { $$ = new token_list($1, $3); }
| IDENT { $$ = new token_list($1); }
+ ;
block: decl_part_list compoundst
{
$$ = new block_node($1, $2);
}
+;
decl_part_list: { $$ = NULL; }
| decl_part decl_part_list { $1->next = $2; $$ = $1; }
+;
decl_part: label_decl_part | const_def_part | type_def_part | var_decl_part
| proc_def | proc_fwd_decl | unit_spec
+;
unit_spec: UNIT IDENT ';' INTERFACE unit_decl_list UNIT_END
{ $$ = new unit_spec_node($1, $2, $3, $4, $5); }
| INTERFACE unit_decl_list UNIT_END
{ $$ = new unit_spec_node(NULL, NULL, NULL, $1, $2); }
-
+;
unit_decl_list: { $$ = NULL; }
| unit_decl unit_decl_list { $1->next = $2; $$ = $1; }
+;
unit_decl: label_decl_part | const_def_part | type_def_part | var_decl_part
| proc_spec | proc_fwd_decl | unit_spec
+;
/*
//=============================================================================
@@ -401,15 +408,20 @@
| ICONST ':' statement { $$ = new label_node($1, $2, $3); }
| IDENT ':' statement { $$ = new label_node($1, $2, $3); }
| compoundst { $$ = $1; }
+;
compoundst: BEGIN sequence END { $$ = new compound_node($1, $2, $3); }
+;
sequence: statement | statement ';' sequence { $1->next = $3; $$ = $1; }
+;
actual_params: { $$ = NULL; } | expr_group { $$ = $1; }
+;
write_params: { $$ = NULL; }
| '(' write_list ')' { $$ = new write_list_node($1, $2, $3); }
+;
case_list: case_items
| case_items otherwise sequence
@@ -423,20 +435,26 @@
$$ = new case_node(NULL, $2, $3);
}
}
+;
otherwise: OTHERWISE | ELSE /* Turbo Pascal */
+;
case_items: { $$ = NULL; }
| case_item
| case_item ';' case_items { $1->next = $3; $$ = $1; }
+;
case_item: case_elem_list ':' statement { $$ = new case_node($1, $2, $3); }
+;
case_elem_list: case_elem
| case_elem ',' case_elem_list { $1->next = $3; $$ = $1; }
+;
case_elem: expr { $$ = $1; }
| expr DOTS expr { $$ = new case_range_node($1, $2, $3); }
+;
/*
//=============================================================================
@@ -485,6 +503,7 @@
| expr OR expr { $$ = new op_node(tn_or, $1, $2, $3); }
| expr XOR expr { $$ = new op_node(tn_xor, $1, $2, $3); }
+
| expr GT expr { $$ = new op_node(tn_gt, $1, $2, $3); }
| expr LT expr { $$ = new op_node(tn_lt, $1, $2, $3); }
| expr LE expr { $$ = new op_node(tn_le, $1, $2, $3); }
@@ -492,6 +511,7 @@
| expr EQ expr { $$ = new op_node(tn_eq, $1, $2, $3); }
| expr NE expr { $$ = new op_node(tn_ne, $1, $2, $3); }
| expr IN expr { $$ = new op_node(tn_in, $1, $2, $3); }
+;
simple_expr: primary
| PLUS simple_expr %prec UPLUS {
@@ -502,6 +522,7 @@
{ $$ = new op_node(tn_not, NULL, $1, $2); }
| '@' primary { $$ = new address_node($1, $2); }
| AND primary %prec ADDRESS { $$ = new address_node($1, $2); }
+;
primary: constant
| '(' expr_list ')' { $$ = new expr_group_node($1, $2, $3); }
@@ -510,6 +531,7 @@
| primary '^' { $$ = new deref_expr_node($1, $2); }
| primary '[' expr_list ']' { $$ = new idx_expr_node($1, $2, $3, $4); }
| LOOPHOLE '(' type ',' expr ')' { $$ = new loophole_node($1, $2, $3, $4, $5, $6); }
+;
constant: record_constant
| ICONST { $$ = new integer_node($1); }
@@ -517,41 +539,49 @@
| SCONST { $$ = new string_node($1); }
| '[' set_elem_list ']' { $$ = new set_node($1, $2, $3); }
| IDENT { $$ = new atom_expr_node($1); }
+;
set_elem_list: { $$ = NULL; }
| set_elem
| set_elem ',' set_elem_list { $1->next = $3; $$ = $1; }
+;
set_elem: expr { $$ = new set_elem_node($1); }
| expr DOTS expr { $$ = new set_range_node($1, $2, $3); }
+;
expr_list: expr | expr ',' expr_list { $1->next = $3; $$ = $1; }
+;
act_param_list: act_param
| act_param ',' act_param_list { $1->next = $3; $$ = $1; }
+;
act_param: expr | { $$ = new skipped_node(curr_token->prev_relevant()); }
-
+;
record_constant: '(' field_init_list ')' {
$$ = new record_constant_node($1, $2, $3);
}
+;
field_init_list: field_init_item { $$ = $1; }
| field_init_item ';' field_init_list { $1->next = $3; $$ = $1; }
+;
field_init_item: IDENT ':' expr { $$ = new field_init_node($1, $2, $3); }
-
+;
expr_group: '(' expr_list ')' { $$ = new expr_group_node($1, $2, $3); }
-
+;
write_list: write_param | write_param ',' write_list { $1->next = $3; $$ = $1; }
+;
write_param: expr { $$ = new write_param_node($1); }
| expr ':' expr { $$ = new write_param_node($1, $2, $3); }
| expr ':' expr ':' expr { $$ = new write_param_node($1, $2, $3, $4, $5); }
-
+;
/*
//=============================================================================
@@ -594,31 +624,40 @@
label_decl_part: LABEL label_list ';'
{ $$ = new label_decl_part_node($1, $2, $3); }
+;
label_list: ICONST { $$ = new token_list($1); }
| ICONST ',' label_list { $$ = new token_list($1, $3); }
| IDENT { $$ = new token_list($1); }
| IDENT ',' label_list { $$ = new token_list($1, $3); }
+;
const_def_part: CONST const_def_list
{ $$ = new const_def_part_node($1, $2); }
+;
const_def_list: { $$ = NULL; }
| const_def ';' const_def_list { $1->next = $3; $$ = $1; }
+;
const_def: IDENT EQ expr { $$ = new const_def_node($1, $2, $3); }
| IDENT ':' const_type EQ expr { $$ = new typed_const_def_node($1, $2, $3, $4, $5); }
+;
type_def_part: TYPE type_def_list
{ $$ = new type_def_part_node($1, $2); }
+;
type_def_list: { $$ = NULL; }
| type_def ';' type_def_list { $1->next = $3; $$ = $1; }
+;
type_def: IDENT EQ type { $$ = new type_def_node($1, $2, $3); }
+;
var_decl_part: VAR var_decl_list
{ $$ = new var_decl_part_node($1, $2); }
+;
var_decl_list: { $$ = NULL; }
| var_decl
@@ -634,29 +673,33 @@
$1->next = $5; $$ = $1;
}
| var_decl ';' var_decl_list { $1->next = $3; $$ = $1; }
+;
var_decl: ident_list ':' type { $$ = new var_decl_node($1, $2, $3); }
| IDENT ORIGIN expr ':' simple_type
{ $$ = (var_decl_node*)new var_origin_decl_node($1, $2, $3, $4, $5); }
+;
proc_decl:
PROCEDURE IDENT formal_params
{ $$ = new proc_decl_node($1, $2, $3); }
| FUNCTION IDENT formal_params ':' type
{ $$ = new proc_decl_node($1, $2, $3, $4, $5); }
-
+;
proc_fwd_decl:
PROCEDURE IDENT formal_params ';' qualifiers ';'
{ $$ = new proc_fwd_decl_node($1, $2, $3, NULL, NULL, $4, $5, $6); }
| FUNCTION IDENT formal_params ':' type ';' qualifiers ';'
{ $$ = new proc_fwd_decl_node($1, $2, $3, $4, $5, $6, $7, $8); }
+;
proc_spec:
PROCEDURE IDENT formal_params ';'
{ $$ = new proc_fwd_decl_node($1, $2, $3, NULL, NULL, $4); }
| FUNCTION IDENT formal_params ':' type ';'
{ $$ = new proc_fwd_decl_node($1, $2, $3, $4, $5, $6); }
+;
proc_def:
PROCEDURE IDENT formal_params ';' block ';'
@@ -675,135 +718,166 @@
{ $$ = new proc_def_node($1, NULL, NULL, $2, $3, $4, $5, $6, $7, $8, $9, $10); }
| FUNCTION IDENT ';' FAR ';' block ';'
{ $$ = new proc_def_node($1, NULL, NULL, $2, NULL, NULL, NULL, $3, $4, $5, $6, $7); }
+;
qualifiers: IDENT qualifiers { $$ = new token_list($1, $2); }
| SCOPE qualifiers { $$ = new token_list($1, $2); }
| IDENT { $$ = new token_list($1); }
| SCOPE { $$ = new token_list($1); }
-
+;
formal_params: { $$ = NULL; }
| '(' formal_param_list ')' { $$ = new param_list_node($1, $2, $3); }
+;
formal_param_list: formal_param
| formal_param ';' formal_param_list { $1->next = $3; $$ = $1; }
+;
formal_param: VAR param_decl { $$ = new var_decl_part_node($1, $2); }
| param_decl { $$ = $1; } | proc_decl
+;
param_decl: ident_list ':' param_type { $$ = new var_decl_node($1, $2, $3); }
| ident_list { $$ = new var_decl_node($1, NULL, NULL); }
+;
param_type: simple_type | conformant_array_type
-
-
+;
/* Types definition */
type: simple_type | array_type | record_type | object_type | set_type | file_type
| pointer_type | enum_type | range_type | string_type | fptr_type
+;
const_type: simple_type | const_array_type | record_type | const_set_type | string_type
+;
fptr_type: FUNCTION formal_params ':' type
{ $$ = new fptr_tpd_node($1, $2, $3, $4); }
| PROCEDURE formal_params { $$ = new fptr_tpd_node($1, $2); }
+;
string_type: STRING '[' expr ']' { $$ = new varying_tpd_node($1, $2, $3, $4); }
+;
simple_type: IDENT { $$ = new simple_tpd_node($1); }
| STRING { $$ = new string_tpd_node($1); }
+;
array_type: packed ARRAY '[' indices ']' OF type
{ $$ = new array_tpd_node($1, $2, $3, $4, $5, $6, $7); }
+;
const_array_type: packed ARRAY '[' indices ']' OF const_type
{ $$ = new array_tpd_node($1, $2, $3, $4, $5, $6, $7); }
+;
conformant_array_type: packed ARRAY '[' conformant_indices ']' OF simple_type
{ $$ = new array_tpd_node($1, $2, $3, $4, $5, $6, $7); }
| packed ARRAY '[' conformant_indices ']' OF conformant_array_type
{ $$ = new array_tpd_node($1, $2, $3, $4, $5, $6, $7); }
+;
enum_type: '(' ident_list ')' { $$ = new enum_tpd_node($1, $2, $3); }
+;
range_type: expr DOTS expr
{ $$ = new range_tpd_node($1, $2, $3); }
+;
pointer_type: '^' type { $$ = new ptr_tpd_node($1, $2); }
+;
set_type: packed SET OF type { $$ = new set_tpd_node($1, $2, $3, $4); }
+;
const_set_type: packed SET OF const_type { $$ = new set_tpd_node($1, $2, $3, $4); }
+;
record_type: packed RECORD field_list END
{ $$ = new record_tpd_node($1, $2, $3, $4); }
+;
object_type: OBJECT object_components END
{ $$ = new object_tpd_node($1, NULL, NULL, NULL, $2, $3); }
| OBJECT '(' IDENT ')' object_components END
{ $$ = new object_tpd_node($1, $2, $3, $4, $5, $6); }
+;
object_components: object_fields object_methods
{ $1->next = $2; $$ = $1; }
| object_methods
| object_fields
+;
object_fields: field_decl_list
{ $$ = new var_decl_part_node(NULL, $1); }
+;
field_decl_list: var_decl
| var_decl ';' { $$ = $1; }
| var_decl ';' field_decl_list { $1->next = $3; $$ = $1; }
+;
object_methods: proc_fwd_decl | proc_spec
| proc_fwd_decl object_methods { $1->next = $2; $$ = $1; }
| proc_spec object_methods { $1->next = $2; $$ = $1; }
-
-
+;
file_type: packed FIL OF type { $$ = new file_tpd_node($1, $2, $3, $4); }
+;
-packed: { $$ = NULL; } | PACKED
+packed: { $$ = NULL; } | PACKED
+;
conformant_indices: conformant_index
| conformant_index ';' conformant_indices { $1->next = $3; $$ = $1; }
+;
conformant_index: IDENT DOTS IDENT ':' type
{ $$ = new conformant_index_node($1, $2, $3, $4, $5); }
+;
indices: index_spec | index_spec ',' indices
{ $1->next = $3; $$ = $1; }
+;
index_spec: simple_type { $$ = new type_index_node($1); }
| expr DOTS expr { $$ = new range_index_node($1, $2, $3); }
-
+;
field_list:
fixed_part variant_part
{ $$ = new field_list_node($1, $2); }
| fixed_part
{ $$ = new field_list_node($1); }
+;
fixed_part: var_decl_list
+;
variant_part: CASE selector OF variant_list
{
$$ = new variant_part_node($1, $2, $3, $4);
}
+;
selector: IDENT ':' type { $$ = new selector_node($1, $2, $3); }
| type { $$ = new selector_node(NULL, NULL, $1); }
-
+;
variant_list: variant
| variant ';' { $$ = $1; }
| variant ';' variant_list { $1->next = $3; $$ = $1; }
+;
variant: expr_list ':' '(' field_list ')'
{
$$ = new variant_node($1, $2, $3, $4, $5);
}
+;
%%