📄 vhdl.y
字号:
/************** Syntax for VHDL in YACC format ******************
*
* Version 0.2 Wed Aug 11, 1993
*
* The original was a VHDL parser description to be used with GMD Compiler
* Tool Box
* written from:
* Jan den Ouden, Jaap Hofstede
* Department of Computer Science (INF/SPA)
* University of Twente
* PB 217, 7500 AE ENSCHEDE, The Netherlands
* Tel: +31 53 893788
* Email: hofstede@cs.utwente.nl
* avail at: ftp.cs.utwente.nl in pub/src/VHDL/Grammar
*
* author of YACC transformation:
* Thomas Dettmer
* Dortmund University
* Dept. of Computer Scienc, LS1
* PB 500 500
* D-44221 Dortmund (Germany)
* Phone: +49-231-755-6464
* e-mail: dettmer@ls1.informatik.uni-dortmund.de
*
* Please report discovered bugs, critics, suggestions
* and changes you make to dettmer@ls1.informatik.uni-dortmund.de
*
* at the end of this file there is a list of users, who discovered bugs,
* and suggested solutions. additionally there's a list of known problems
*
****************************************************************
*
* This file is intended not to be used for commercial purposes
* without permission of the University of Twente and permission
* of the University of Dortmund
*
* NOTE THAT THERE IS NO WARRANTY FOR CORRECTNES, COMPLETENESS, SUPPORT
* OR ANYTHING ELSE.
*
****************************************************************
*
* Note that the context-free syntax of VHDL in [LRM] is ambiguous
* (and so is not LR(1)) and that the language VHDL makes it impossible to
* construct a non-ambiguous context-free syntax. Therefore a deterministic
* parser based on a non-ambiguous context-free syntax has to accept a too
* large class of inputs. Inputs which are accepted by the parser but are not
* correct VHDL must be rejected by static semantical checks.
*******************************************************/
%{
#include <stdio.h>
%}
%union{
struct{
int pos;
int len;
int line;
char *name;
} ds_Id;
}
%token
t_ACCESS
t_AFTER
t_ALIAS
t_ALL
t_AND
t_ARCHITECTURE
t_ARRAY
t_ASSERT
t_ATTRIBUTE
t_BEGIN
t_BLOCK
t_BODY
t_BUFFER
t_BUS
t_CASE
t_COMPONENT
t_CONFIGURATION
t_CONSTANT
t_DISCONNECT
t_DOWNTO
t_ELSE
t_ELSIF
t_END
t_ENTITY
t_EXIT
t_FILE
t_FOR
t_FUNCTION
t_GENERATE
t_GENERIC
t_GUARDED
t_IF
t_IN
t_INOUT
t_IS
t_LABEL
t_LIBRARY
t_LINKAGE
t_LOOP
t_MAP
t_NAND
t_NEW
t_NEXT
t_NOR
t_NULL
t_OF
t_ON
t_OPEN
t_OR
t_OTHERS
t_OUT
t_PACKAGE
t_PORT
t_PROCEDURE
t_PROCESS
t_RANGE
t_RECORD
t_REGISTER
t_REPORT
t_RETURN
t_SELECT
t_SEVERITY
t_SIGNAL
t_SUBTYPE
t_THEN
t_TO
t_TRANSPORT
t_TYPE
t_UNITS
t_UNTIL
t_USE
t_VARIABLE
t_WAIT
t_WHEN
t_WHILE
t_WITH
t_XOR
/* VHDL binary operators
======================= */
%nonassoc t_EQSym t_NESym t_LTSym t_LESym t_GTSym t_GESym
%left t_Plus t_Minus t_Ampersand
%left MED_PRECEDENCE
%left t_Star t_Slash t_MOD t_REM
%nonassoc t_DoubleStar t_ABS t_NOT MAX_PRECEDENCE
/* misc syms */
/*t_Space */
%token t_Apostrophe
t_LeftParen
t_RightParen
t_Comma
t_VarAsgn
t_Colon
t_Semicolon
t_Arrow
t_Box
t_Bar
t_Dot
%token < ds_Id > t_Identifier
t_AbstractLit
t_CharacterLit
t_StringLit
t_BitStringLit
%%
start: design_file
;design_file : design_unit_list
;design_unit_list: design_unit
| design_unit_list design_unit
;designator : t_Identifier
| t_StringLit
;literal : t_AbstractLit
| t_CharacterLit
| t_BitStringLit
| physical_literal_no_default
| t_NULL
;enumeration_literal : t_CharacterLit
| t_Identifier
;physical_literal : physical_literal_1 t_Identifier
;physical_literal_1 :
| t_AbstractLit
;physical_literal_no_default : t_AbstractLit t_Identifier
;idf_list : t_Identifier
| idf_list t_Comma t_Identifier
/*------------------------------------------
-- Desing Unit
--------------------------------------------*/
;design_unit : context_list lib_unit
;context_list :
| context_list context_item
;lib_unit : entity_decl
| config_decl
| package_decl
| arch_body
| package_body
;context_item : lib_clause
| use_clause
;lib_clause : t_LIBRARY idf_list t_Semicolon
;use_clause : t_USE sel_list t_Semicolon
;sel_list : sel_name
| sel_list t_Comma sel_name
/*------------------------------------------
-- Library Units
--------------------------------------------*/
;entity_decl : entity_start entity_decl_1 entity_decl_2
entity_decl_3 entity_decl_4 t_END entity_decl_5 t_Semicolon
;entity_start: t_ENTITY t_Identifier t_IS
;entity_decl_5 :
| t_Identifier
;entity_decl_4 :
| t_BEGIN concurrent_stats
;entity_decl_3 :
| entity_decl_3 entity_decl_6
;entity_decl_6 : entity_decltve_item
;entity_decl_2 :
| t_PORT interf_list t_Semicolon
;entity_decl_1 :
| t_GENERIC interf_list t_Semicolon
;arch_body : arch_start arch_body_1 t_BEGIN concurrent_stats t_END
arch_body_2 t_Semicolon
;arch_start : t_ARCHITECTURE t_Identifier t_OF t_Identifier t_IS
;arch_body_2 :
;arch_body_2 : t_Identifier
;arch_body_1 :
;arch_body_1 : arch_body_1 arch_body_3
;arch_body_3 : block_decltve_item
;config_decl : config_start config_decl_1 block_config t_END config_decl_2 t_Semicolon
/* ;config_start : t_CONFIGURATION t_Identifier t_OF mark t_IS
replaced: */
;config_start : t_CONFIGURATION t_Identifier t_OF t_Identifier t_IS
;config_decl_2 :
;config_decl_2 : t_Identifier
;config_decl_1 :
;config_decl_1 : config_decl_1 config_decl_3
;config_decl_3 : config_decltve_item
;package_decl : package_start package_decl_1 t_END package_decl_2 t_Semicolon
;package_start : t_PACKAGE t_Identifier t_IS
;package_decl_2 :
;package_decl_2 : t_Identifier
;package_decl_1 :
;package_decl_1 : package_decl_1 package_decl_3
;package_decl_3 : package_decltve_item
;package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon
;pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS
;package_body_2 :
;package_body_2 : t_Identifier
;package_body_1 :
;package_body_1 : package_body_1 package_body_3
;package_body_3 : package_body_decltve_item
/*------------------------------------------
-- Declarative Item
--------------------------------------------*/
;common_decltve_item : type_decl
;common_decltve_item : subtype_decl
;common_decltve_item : constant_decl
;common_decltve_item : file_decl
;common_decltve_item : alias_decl
;common_decltve_item : subprog_decl
;common_decltve_item : use_clause
;entity_decltve_item : common_decltve_item
;entity_decltve_item : subprog_body
;entity_decltve_item : attribute_decl
;entity_decltve_item : attribute_spec
;entity_decltve_item : disconnection_spec
;entity_decltve_item : signal_decl
;block_decltve_item : common_decltve_item
;block_decltve_item : subprog_body
;block_decltve_item : comp_decl
;block_decltve_item : attribute_decl
;block_decltve_item : attribute_spec
;block_decltve_item : config_spec
;block_decltve_item : disconnection_spec
;block_decltve_item : signal_decl
;package_decltve_item : common_decltve_item
;package_decltve_item : comp_decl
;package_decltve_item : attribute_decl
;package_decltve_item : attribute_spec
;package_decltve_item : disconnection_spec
;package_decltve_item : signal_decl
;package_body_decltve_item : common_decltve_item
;package_body_decltve_item : subprog_body
;subprog_decltve_item : common_decltve_item
;subprog_decltve_item : subprog_body
;subprog_decltve_item : attribute_decl
;subprog_decltve_item : attribute_spec
;subprog_decltve_item : variable_decl
;procs_decltve_item : common_decltve_item
;procs_decltve_item : subprog_body
;procs_decltve_item : attribute_decl
;procs_decltve_item : attribute_spec
;procs_decltve_item : variable_decl
;config_decltve_item : attribute_spec
;config_decltve_item : use_clause
/*------------------------------------------
-- Subprograms
--------------------------------------------*/
;subprog_decl : subprog_spec t_Semicolon
;subprog_spec : t_PROCEDURE t_Identifier subprog_spec_1
;subprog_spec : t_FUNCTION designator subprog_spec_2 t_RETURN mark
;subprog_spec_2 :
;subprog_spec_2 : interf_list
;subprog_spec_1 :
;subprog_spec_1 : interf_list
;subprog_body : subprog_spec t_IS subprog_body_1 t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon
;subprog_body_2 :
;subprog_body_2 : designator
;subprog_body_1 :
;subprog_body_1 : subprog_body_1 subprog_body_3
;subprog_body_3 : subprog_decltve_item
/*--------------------------------------------------
-- Interface Lists and Associaton Lists
----------------------------------------------------*/
;interf_list : t_LeftParen interf_element interf_list_1 t_RightParen
;interf_list_1 :
;interf_list_1 : interf_list_1 interf_list_2
;interf_list_2 : t_Semicolon interf_element
;interf_element : interf_element_1 idf_list t_Colon interf_element_2 subtype_indic interf_element_3 interf_element_4
;interf_element_4 :
;interf_element_4 : t_VarAsgn expr
;interf_element_3 :
;interf_element_3 : t_BUFFER
;interf_element_2 :
;interf_element_2 : mode
;interf_element_1 :
;interf_element_1 : object_class
;mode : t_IN
;mode : t_OUT
;mode : t_INOUT
;mode : t_BUFFER
;mode : t_LINKAGE
;association_list : t_LeftParen association_element association_list_1 t_RightParen
;association_list_1 :
;association_list_1 : association_list_1 association_list_2
;association_list_2 : t_Comma association_element
;gen_association_list : t_LeftParen gen_association_element gen_association_list_1 t_RightParen
;gen_association_list_1 :
;gen_association_list_1 : gen_association_list_1 gen_association_list_2
;gen_association_list_2 : t_Comma gen_association_element
;association_element : formal_part t_Arrow actual_part
;association_element : actual_part
/* changed ;gen_association_element : association_element */
;gen_association_element : expr
;gen_association_element : discrete_range1
;formal_part : name
;actual_part : expr
;actual_part : t_OPEN
/*--------------------------------------------------
-- Names and Expressions
----------------------------------------------------*/
;mark : t_Identifier
;mark : sel_name
;expr : and_relation
;expr : or_relation
;expr : xor_relation
;expr : relation
;expr : relation t_NAND relation
;expr : relation t_NOR relation
;and_relation : relation t_AND relation
;and_relation : and_relation t_AND relation
;or_relation : relation t_OR relation
;or_relation : or_relation t_OR relation
;xor_relation : relation t_XOR relation
;xor_relation : xor_relation t_XOR relation
/* ;relation : unary_operator primary */
;relation : primary
;relation : t_Plus primary %prec MED_PRECEDENCE
;relation : t_Minus primary %prec MED_PRECEDENCE
;relation : t_ABS primary
;relation : t_NOT primary
;relation : primary t_DoubleStar primary
/* ; relation : relation binary_operator primary */
;relation : relation t_MOD relation
;relation : relation t_REM relation
;relation : relation t_Ampersand relation
;relation : relation t_Star relation
;relation : relation t_Plus relation
;relation : relation t_Minus relation
;relation : relation t_LESym relation
;relation : relation t_GESym relation
;relation : relation t_LTSym relation
;relation : relation t_GTSym relation
;relation : relation t_EQSym relation
;relation : relation t_NESym relation
;relation : relation t_Slash relation
;primary : name
;primary : literal
;primary : aggregate
;primary : qualified_expr
;primary : allocator
;primary : t_LeftParen expr t_RightParen
;name : mark
;name : name2
;name2 : t_StringLit
;name2 : attribute_name
;name2 : ifts_name
;sel_name : name t_Dot suffix
;suffix : designator
;suffix : t_CharacterLit
;suffix : t_ALL
;ifts_name : mark gen_association_list
;ifts_name : name2 gen_association_list
;attribute_name : mark t_Apostrophe t_Identifier
;attribute_name : name2 t_Apostrophe t_Identifier
;attribute_name : mark t_Apostrophe t_RANGE
;attribute_name : name2 t_Apostrophe t_RANGE
;aggregate : element_association_list2 t_RightParen
;aggregate : t_LeftParen choices t_Arrow expr t_RightParen
;element_association_list2 : t_LeftParen element_association t_Comma element_association
;element_association_list2 : element_association_list2 t_Comma element_association
;qualified_expr : mark t_Apostrophe t_LeftParen expr t_RightParen
;qualified_expr : mark t_Apostrophe aggregate
;allocator : t_NEW mark mark allocator_1
;allocator : t_NEW mark allocator_2
;allocator : t_NEW qualified_expr
;allocator_2 :
;allocator_2 : gen_association_list
;allocator_1 :
;allocator_1 : gen_association_list
/*--------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -