📄 ada.y
字号:
%{
#include "lex.yy.c"
%}
%token ABORT_ ABS_ ACCEPT_ ACCESS_ ALL_ AND_ ARRAY_ AT_
%token BEGIN_ BODY_
%token CASE_ CONSTANT_
%token DECLARE_ DELAY_ DELTA_ DIGITS_ DO_
%token ELSE_ ELSIF_ END_ ENTRY_ EXCEPTION_ EXIT_
%token FOR_ FUNCTION_
%token GENERIC_ GOTO_
%token IF_ IN_ IS_
%token LIMITED_ LOOP_
%token MOD_
%token NEW_ NOT_ NULL_
%token OF_ OR_ OTHERS_ OUT_
%token PACKAGE_ PRAGMA_ PRIVATE_ PROCEDURE_
%token RAISE_ RANGE_ RECORD_ REM_ RENAMES_ RETURN_ REVERSE_
%token SELECT_ SEPARATE_ SUBTYPE_
%token TASK_ TERMINATE_ THEN_ TYPE_
%token USE_
%token WHEN_ WHILE_ WITH_
%token XOR_
%token identifier numeric_literal string_literal character_literal
%token ARROW_ DBLDOT_ EXP_ ASSIGN_ NOTEQL_ GTEQL_ LTEQ_ L_LBL_ R_LBL_ BOX_
%start compilation
%%
/* 2.8 */
prag : PRAGMA_ identifier .arg_ascs ';';
arg_asc :
expr |
identifier ARROW_ expr;
/* 3.1 */
basic_d :
object_d |
ty_d |
subty_d |
subprg_d |
pkg_d |
task_d |
gen_d |
excptn_d |
gen_inst |
renaming_d |
number_d |
error ';';
/* 3.2 */
object_d :
idents ':' subty_ind ._ASN_expr. ';' |
idents ':' CONSTANT_ subty_ind ._ASN_expr. ';' |
idents ':' c_arr_def ._ASN_expr. ';' |
idents ':' CONSTANT_ c_arr_def ._ASN_expr. ';';
number_d : idents ':' CONSTANT_ ASSIGN_ expr ';';
idents : identifier ...ident..;
/* 3.3.1 */
ty_d :
full_ty_d |
incomplete_ty_d |
priv_ty_d;
full_ty_d :
TYPE_ identifier IS_ ty_def ';' |
TYPE_ identifier discr_part IS_ ty_def ';';
ty_def :
enum_ty_def |
integer_ty_def |
real_ty_def |
array_ty_def |
rec_ty_def |
access_ty_def |
derived_ty_def;
/* 3.3.2 */
subty_d : SUBTYPE_ identifier IS_ subty_ind ';';
subty_ind : ty_mk .constrt.;
ty_mk : expanded_n;
constrt :
rng_c |
fltg_point_c |
fixed_point_c |
aggr;
/* 3.4 */
derived_ty_def : NEW_ subty_ind;
/* 3.5 */
rng_c : RANGE_ rng;
rng :
name |
sim_expr DBLDOT_ sim_expr;
/* 3.5.1 */
enum_ty_def : '(' enum_lit_spec ...enum_lit_spec.. ')';
enum_lit_spec : enum_lit;
enum_lit :
identifier |
character_literal;
/* 3.5.4 */
integer_ty_def : rng_c;
/* 3.5.6 */
real_ty_def :
fltg_point_c |
fixed_point_c;
/* 3.5.7 */
fltg_point_c : fltg_accuracy_def .rng_c.;
fltg_accuracy_def : DIGITS_ sim_expr;
/* 3.5.9 */
fixed_point_c : fixed_accuracy_def .rng_c.;
fixed_accuracy_def : DELTA_ sim_expr;
/* 3.6 */
array_ty_def :
uncnstrnd_array_def |
c_arr_def;
uncnstrnd_array_def : ARRAY_ '(' idx_subty_def ...idx_subty_def.. ')' OF_ subty_ind;
c_arr_def : ARRAY_ idx_c OF_ subty_ind;
idx_subty_def : name RANGE_ BOX_;
idx_c : '(' dscr_rng ...dscr_rng.. ')';
dscr_rng :
rng |
name rng_c;
/* 3.7 */
rec_ty_def :
RECORD_
cmpons
END_ RECORD_;
cmpons :
..prag.. ..cmpon_d.. cmpon_d ..prag.. |
..prag.. ..cmpon_d.. variant_part ..prag.. |
..prag.. NULL_ ';' ..prag..;
cmpon_d : idents ':' cmpon_subty_def ._ASN_expr. ';';
cmpon_subty_def : subty_ind;
/* 3.7.1 */
discr_part : '(' discr_spec ...discr_spec.. ')';
discr_spec : idents ':' ty_mk ._ASN_expr.;
/* 3.7.2 */
/*
* included under aggr
*
* discr_c : '(' discr_asc ... discr_asc.. ')';
* discr_asc : .discr_sim_n ..or_discrim_sim_n.. ARROW. expression;
*/
/* 3.7.3 */
variant_part :
CASE_ sim_n IS_
..prag.. variant ..variant..
END_ CASE_ ';';
variant :
WHEN_ choice ..or_choice.. ARROW_
cmpons;
choice :
sim_expr |
name rng_c |
sim_expr DBLDOT_ sim_expr |
OTHERS_;
/* 3.8 */
access_ty_def : ACCESS_ subty_ind;
/* 3.8.1 */
incomplete_ty_d :
TYPE_ identifier ';' |
TYPE_ identifier discr_part ';';
/* 3.9 */
decl_part :
..basic_decl_item.. |
..basic_decl_item.. body ..later_decl_item..;
basic_decl_item :
basic_d |
rep_cl |
use_cl;
later_decl_item :
body |
subprg_d |
pkg_d |
task_d |
gen_d |
use_cl |
gen_inst;
body :
proper_body |
body_stub;
proper_body :
subprg_body |
pkg_body |
task_body;
/* 4.1 */
name :
sim_n |
character_literal |
op_symbol |
idxed_cmpon |
selected_cmpon |
attribute;
sim_n : identifier;
prefix : name;
/* 4.1.1 */
idxed_cmpon : prefix aggr;
/* 4.1.2 */
/*
* included under idxed_cmpon
*
* slice : prefix '(' dscr_rng ')';
*/
/* 4.1.3 */
selected_cmpon : prefix '.' selector;
selector :
sim_n |
character_literal |
op_symbol |
ALL_;
/* 4.1.4 */
/* prefix can be an attribute, idxed cmpon, slice, or subprg call. */
attribute : prefix '\'' attribute_designator;
attribute_designator :
sim_n |
DIGITS_ |
DELTA_ |
RANGE_;
/* 4.3 */
aggr : '(' cmpon_asc ...cmpon_asc.. ')';
cmpon_asc :
expr |
choice ..or_choice.. ARROW_ expr |
sim_expr DBLDOT_ sim_expr |
name rng_c;
/* 4.4 */
expr :
rel..AND__rel.. |
rel..AND__THEN__rel.. |
rel..OR__rel.. |
rel..OR__ELSE__rel.. |
rel..XOR__rel..;
rel :
sim_expr .relal_op__sim_expr. |
sim_expr.NOT.IN__rng_or_sim_expr.NOT.IN__ty_mk;
sim_expr : .unary_add_op.term..binary_add_op__term..;
term : factor..mult_op__factor..;
factor :
pri ._EXP___pri. |
ABS_ pri |
NOT_ pri;
pri :
numeric_literal |
NULL_ |
allocator |
qualified_expr |
name |
aggr;
/* "'(' expr ')'" is included under aggr */
/* 4.5 */
/*
* logical_op :
* AND_
* OR_
* XOR_;
*
* This is an unused syntactic class.
*/
relal_op :
'=' |
NOTEQL_ |
'<' |
LTEQ_ |
'>' |
GTEQL_;
binary_add_op :
'+' |
'-' |
'&';
unary_add_op :
'+' |
'-';
mult_op :
'*' |
'/' |
MOD_ |
REM_;
/*
* highest_precedence_op :
* EXP_
* ABS_
* NOT_;
*
* This is an unused syntactic class.
*/
/* 4.6 */
/*
* included under name
*
* ty_cnvr : ty_mk '(' expr ')';
*/
/* 4.7 */
qualified_expr : ty_mkaggr_or_ty_mkPexprP_;
/* 4.8 */
allocator :
NEW_ ty_mk |
NEW_ ty_mk aggr |
NEW_ ty_mk '\'' aggr;
/* 5.1 */
seq_of_stmts : ..prag.. stmt ..stmt..;
stmt :
..label.. sim_stmt |
..label.. compound_stmt |
error ';';
/* procedure and ent call stmts are included under name */
sim_stmt :
null_stmt |
assignment_stmt |
exit_stmt |
return_stmt |
goto_stmt |
delay_stmt |
abort_stmt |
raise_stmt |
code_stmt |
name ';';
compound_stmt :
if_stmt |
case_stmt |
loop_stmt |
block_stmt |
accept_stmt |
select_stmt;
label : L_LBL_ sim_n R_LBL_;
null_stmt : NULL_ ';';
/* 5.2 */
assignment_stmt : name ASSIGN_ expr ';';
/* 5.3 */
if_stmt :
IF_ cond THEN_
seq_of_stmts
..ELSIF__cond__THEN__seq_of_stmts..
.ELSE__seq_of_stmts.
END_ IF_ ';';
cond : expr;
/* 5.4 */
case_stmt :
CASE_ expr IS_
case_stmt_alt..case_stmt_alt..
END_ CASE_ ';';
case_stmt_alt :
WHEN_ choice ..or_choice.. ARROW_
seq_of_stmts;
/* 5.5 */
loop_stmt :
.sim_nC.
.iteration_scheme. LOOP_
seq_of_stmts
END_ LOOP_ .sim_n. ';';
iteration_scheme :
WHILE_ cond |
FOR_ loop_prm_spec;
loop_prm_spec :
identifier IN_ .REVERSE. dscr_rng;
/* 5.6 */
block_stmt :
.sim_nC.
.DECLARE__decl_part.
BEGIN_
seq_of_stmts
.EXCEPTION__excptn_handler..excptn_handler...
END_ .sim_n. ';';
/* 5.7 */
exit_stmt : EXIT_ .expanded_n. .WHEN__cond. ';';
/* 5.8 */
return_stmt : RETURN_ .expr. ';';
/* 5.9 */
goto_stmt : GOTO_ expanded_n ';';
/* 6.1 */
subprg_d : subprg_spec ';';
subprg_spec :
PROCEDURE_ identifier .fml_part. |
FUNCTION_ designator .fml_part. RETURN_ ty_mk;
designator :
identifier |
op_symbol;
op_symbol : string_literal;
fml_part : '(' prm_spec .._.prm_spec.. ')';
prm_spec : idents ':' mode ty_mk ._ASN_expr.;
mode :
.IN. |
IN_ OUT_ |
OUT_;
/* 6.3 */
subprg_body :
subprg_spec IS_
.decl_part.
BEGIN_
seq_of_stmts
.EXCEPTION__excptn_handler..excptn_handler...
END_ .designator. ';';
/* 6.4 */
/*
* procedure_call_stmt : procedure_n .act_prm_part. ';';
*
* func_call : func_n .act_prm.;
*
* act_prm_part : '(' prm_asc ... prm_asc .._paren;
*
* prm_asc : .fml_prm ARROW. act_prm;
*
* fml_prm : sim_n;
*
* act_prm :
* expr |
* name |
* ty_mk '(' name ')';
*
* procedure_call_stmt and func_call are included under name
*/
/* 7.1 */
pkg_d : pkg_spec ';';
pkg_spec :
PACKAGE_ identifier IS_
..basic_decl_item..
.PRIVATE..basic_decl_item...
END_ .sim_n.;
pkg_body :
PACKAGE_ BODY_ sim_n IS_
.decl_part.
.BEGIN__seq_of_stmts.EXCEPTION__excptn_handler..excptn_handler...
END_ .sim_n. ';';
/* 7.4 */
priv_ty_d :
TYPE_ identifier IS_ .LIMITED. PRIVATE_ ';' |
TYPE_ identifier discr_part IS_ .LIMITED. PRIVATE_ ';';
/*
* included under object_d
*
* defer_const_d : idents : CONSTANT_ ty_mk ';';
*/
/* 8.4 */
use_cl : USE_ expanded_n ...expanded_n.. ';';
/* 8.5 */
/* idents in the following rule must contain only one identifier */
renaming_d :
idents ':' ty_mk RENAMES_ name ';' |
idents ':' EXCEPTION_ RENAMES_ expanded_n ';' |
PACKAGE_ identifier RENAMES_ expanded_n ';' |
subprg_spec RENAMES_ name ';';
/* 9.1 */
task_d : task_spec ';';
task_spec :
TASK_ .TYPE. identifier
.IS..ent_d_..rep_cl_END.sim_n.;
task_body :
TASK_ BODY_ sim_n IS_
.decl_part.
BEGIN_
seq_of_stmts
.EXCEPTION__excptn_handler..excptn_handler...
END_ .sim_n. ';';
/* 9.5 */
ent_d :
ENTRY_ identifier .fml_part. ';' |
ENTRY_ identifier '(' dscr_rng ')' .fml_part. ';';
ent_call_stmt : ..prag.. name ';';
accept_stmt :
ACCEPT_ sim_n .Pent_idx_P..fml_part.
.DO__seq_of_stmts__END.sim_n.. ';';
ent_idx : expr;
/* 9.6 */
delay_stmt : DELAY_ sim_expr ';';
/* 9.7 */
select_stmt :
selec_wait |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -