cdesktopenv/cde/osf/wml/wmlparse.y

729 lines
15 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @OSF_COPYRIGHT@
* COPYRIGHT NOTICE
* Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
* ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
* the full copyright text.
*/
/*
* HISTORY
*/
/* "$TOG: wmlparse.y /main/10 1997/04/14 12:56:03 dbl $" */
/*
* This file defines the grammar for the Motif Widget Meta Language (WML),
* the declarative language which describes the widget, gadgets, and
* resources in the UIL language.
*/
%{
#include "wml.h"
#if defined(__STDC__)
#include <string.h> /* for strcpy() */
#endif
#ifndef XmConst
#if (defined(__STDC__) && __STDC__) || !defined( NO_CONST )
#define XmConst const
#else
#define XmConst
#endif /* __STDC__ */
#endif /* XmConst */
/*
* Undefine NULL, since it is defined in stdio
*/
#undef NULL
%}
/*
* Tokens defining terminals of the language
*/
/*
* token 0 is EOF, not defined here
*/
/*
* WML statements
*/
%token CLASS 1 /* CLASS statement */
%token RESOURCE 2 /* RESOURCE statement */
%token DATATYPE 3 /* DATATYPE statement */
%token CONTROLLIST 4 /* CONTROLLIST statement */
%token ENUMERATIONSET 5 /* ENUMERATIONSET statement */
%token ENUMERATIONVALUE 6 /* ENUMERATIONVALUE statement */
%token CHARACTERSET 7 /* CHARACTERSET statement */
%token CHILD 50 /* CHILD statement */
/*
* Statement attributes
*/
%token DOCNAME 8 /* DOCNAME attribute */
%token CONVFUNC 9 /* CONVENIENCEFUNCTION attribute */
%token ALIAS 10 /* ALIAS attribute */
%token TYPE 11 /* TYPE attribute */
%token RESOURCELITERAL 12 /* RESOURCELITERAL attribute */
%token RELATED 13 /* RELATED attribute */
%token INTERNALLITERAL 14 /* INTERNALLITERAL attribute */
%token XRMRESOURCE 15 /* XRMRESOURCE attribute */
%token EXCLUDE 16 /* EXCLUDE attribute */
%token RESOURCES 17 /* RESOURCES attribute */
%token SUPERCLASS 18 /* SUPERCLASS attribute */
%token CONTROLS 19 /* CONTROLS attribute */
%token WIDGETCLASS 20 /* WIDGETCLASS attribute */
%token DIALOGCLASS 21 /* DIALOGCLASS attribute */
%token DEFAULT 22 /* DEFAULT attribute */
%token ENUMLITERAL 23 /* ENUMLITERAL attribute */
%token XMSTRINGCHARSETNAME 24 /* XMSTRINGCHARSETNAME attribute */
%token DIRECTION 25 /* DIRECTION attribute */
%token PARSEDIRECTION 26 /* PARSEDIRECTION attribute */
%token CHARACTERSIZE 27 /* CHARACTERSIZE attribute */
%token CTRLMAPSRESOURCE 28 /* CTRLMAPSRESOURCE attribute */
%token CHILDREN 51 /* CHILDREN attribute */
%token PARENTCLASS 52 /* PARENTCLASS attribute */
/*
* Other keywords
*/
%token METACLASS 29 /* CLASS type */
%token WIDGET 30 /* CLASS type */
%token GADGET 31 /* CLASS type */
%token ARGUMENT 32 /* RESOURCE type */
%token REASON 33 /* RESOURCE type */
%token CONSTRAINT 34 /* RESOURCE type */
%token SUBRESOURCE 35 /* RESOURCE type */
%token ATTRTRUE 36 /* attribute value */
%token ATTRFALSE 37 /* attribute value */
%token LEFTTORIGHT 38 /* DIRECTION attribute */
%token RIGHTTOLEFT 39 /* DIRECTION attribute */
%token ONEBYTE 40 /* CHARACTERSIZE attribute */
%token TWOBYTE 41 /* CHARACTERSIZE attribute */
%token MIXED1_2BYTE 42 /* CHARACTERSIZE attribute */
/*
* Special characters
*/
%token COLON 43
%token SEMICOLON 44
%token EQUALS 45
%token LBRACE 46
%token RBRACE 47
/*
* non-terminals
*/
%token STRING 48 /* Any user literal */
/*
* Others
*/
%token ERRORTOKEN 49 /* Any unrecognized character */
%start statement_block_list
%%
/*
* Productions of the WML grammar. All routines assume that current
* data structures are kept in globals. This works as the language has
* no recursive elements.
*/
/*
* The language consists of blocks of statements. The blocks may occur
* in any order, and blocks of the same kind may be arbitrarily repeated.
*/
statement_block_list
: /* empty */
| statement_block_list statement_block
;
statement_block
: class_statement_block
| resource_statement_block
| child_statement_block
| datatype_statement_block
| ctrlist_statement_block
| enumset_statement_block
| enumval_statement_block
| charset_statement_block
| error { LexIssueError(0); } SEMICOLON
;
/*
* Statement blocks. Each statement block begins with its identifying
* keyword, then includes an arbitrary number of statements
*/
class_statement_block
: CLASS
class_statement_list
;
class_statement_list
: class_statement SEMICOLON
| class_statement_list class_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
resource_statement_block
: RESOURCE
resource_statement_list
;
resource_statement_list
: resource_statement SEMICOLON
| resource_statement_list resource_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
child_statement_block
: CHILD
child_statement_list
;
child_statement_list
: child_statement SEMICOLON
| child_statement_list child_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
datatype_statement_block
: DATATYPE
datatype_statement_list
;
datatype_statement_list
: datatype_statement SEMICOLON
| datatype_statement_list datatype_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
ctrlist_statement_block
: CONTROLLIST
ctrlist_statement_list
;
ctrlist_statement_list
: ctrlist_statement SEMICOLON
| ctrlist_statement_list ctrlist_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
enumset_statement_block
: ENUMERATIONSET
enumset_statement_list
;
enumset_statement_list
: enumset_statement SEMICOLON
| enumset_statement_list enumset_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
enumval_statement_block
: ENUMERATIONVALUE
enumval_statement_list
;
enumval_statement_list
: enumval_statement SEMICOLON
| enumval_statement_list enumval_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
charset_statement_block
: CHARACTERSET
charset_statement_list
;
charset_statement_list
: charset_statement SEMICOLON
| charset_statement_list charset_statement SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
/*
* The CLASS statement
*/
class_statement
: name
COLON
class_type
{ wmlCreateClass (yynameval, yytknval1); }
class_definition
;
class_type
: METACLASS { yytknval1 = METACLASS; }
| WIDGET { yytknval1 = WIDGET; }
| GADGET { yytknval1 = GADGET; }
;
class_definition
: /* empty */
| LBRACE RBRACE
| LBRACE class_attribute_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_attribute_list
: class_attribute
| class_attribute_list class_attribute
;
class_attribute
: class_attribute_name
EQUALS
STRING
{ wmlAddClassAttribute (yytknval1, yystringval); }
SEMICOLON
| boolean_class_attribute_name
EQUALS
boolean_attribute_value
{ wmlAddClassAttribute (yytknval1, yytknval2); }
SEMICOLON
| class_resources SEMICOLON
| class_controls SEMICOLON
| class_children SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
class_attribute_name
: SUPERCLASS { yytknval1 = SUPERCLASS; }
| PARENTCLASS { yytknval1 = PARENTCLASS; }
| INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
| DOCNAME { yytknval1 = DOCNAME; }
| CONVFUNC { yytknval1 = CONVFUNC; }
| WIDGETCLASS { yytknval1 = WIDGETCLASS; }
| CTRLMAPSRESOURCE { yytknval1 = CTRLMAPSRESOURCE; }
;
boolean_class_attribute_name
: DIALOGCLASS { yytknval1 = DIALOGCLASS; }
boolean_attribute_value
: ATTRTRUE { yytknval2 = ATTRTRUE; }
| ATTRFALSE { yytknval2 = ATTRFALSE; }
;
class_resources
: RESOURCES class_resources_block
;
class_resources_block
: /* empty */
| LBRACE RBRACE
| LBRACE class_resource_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_resource_list
: class_resource_element
| class_resource_list class_resource_element
;
class_resource_element
: name
{ wmlAddClassResource (yynameval); }
class_resource_attributes
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
class_resource_attributes
: /* empty */
| LBRACE RBRACE
| LBRACE class_resource_attribute_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_resource_attribute_list
: class_resource_attribute_element
| class_resource_attribute_list class_resource_attribute_element
;
class_resource_attribute_element
: class_resource_attribute_name
EQUALS
STRING
{ wmlAddClassResourceAttribute (yytknval1, yystringval); }
SEMICOLON
| boolean_class_resource_attribute_name
EQUALS
boolean_attribute_value
{ wmlAddClassResourceAttribute (yytknval1, yytknval2); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
class_resource_attribute_name
: TYPE { yytknval1 = TYPE; }
| DEFAULT { yytknval1 = DEFAULT; }
;
boolean_class_resource_attribute_name
: EXCLUDE { yytknval1 = EXCLUDE; }
;
class_controls
: CONTROLS class_controls_block
;
class_controls_block
: /* empty */
| LBRACE RBRACE
| LBRACE class_controls_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_controls_list
: class_controls_element
| class_controls_list class_controls_element
;
class_controls_element
: name
{ wmlAddClassControl (yynameval); }
class_controls_attributes
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
class_controls_attributes
: /* empty */
| LBRACE RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_children
: CHILDREN class_children_block
;
class_children_block
: /* empty */
| LBRACE RBRACE
| LBRACE class_children_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
class_children_list
: class_children_element
| class_children_list class_children_element
;
class_children_element
: name
{ wmlAddClassChild (yynameval); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
/*
* The RESOURCE statement
*/
resource_statement
: name
COLON
resource_type
{ wmlCreateResource (yynameval, yytknval1); }
resource_definition
;
resource_type
: ARGUMENT { yytknval1 = ARGUMENT; }
| REASON { yytknval1 = REASON; }
| CONSTRAINT { yytknval1 = CONSTRAINT; }
| SUBRESOURCE { yytknval1 = SUBRESOURCE; }
;
resource_definition
: /* empty */
| LBRACE RBRACE
| LBRACE resource_attribute_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
resource_attribute_list
: resource_attribute
| resource_attribute_list resource_attribute
;
resource_attribute
: resource_attribute_name
EQUALS
STRING
{ wmlAddResourceAttribute (yytknval1, yystringval); }
SEMICOLON
| boolean_resource_resource_attribute_name
EQUALS
boolean_attribute_value
{ wmlAddResourceAttribute (yytknval1, yytknval2); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
resource_attribute_name
: TYPE { yytknval1 = TYPE; }
| RESOURCELITERAL { yytknval1 = RESOURCELITERAL; }
| ENUMERATIONSET { yytknval1 = ENUMERATIONSET; }
| INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
| RELATED { yytknval1 = RELATED; }
| DOCNAME { yytknval1 = DOCNAME; }
| DEFAULT { yytknval1 = DEFAULT; }
| ALIAS { yytknval1 = ALIAS; }
;
boolean_resource_resource_attribute_name
: XRMRESOURCE { yytknval1 = XRMRESOURCE; }
;
/*
* The CHILD statement
*/
child_statement
: name COLON STRING
{ wmlCreateChild(yynameval, yystringval); }
;
/*
* DATATYPE statement
*/
datatype_statement
: name
{ wmlCreateDatatype (yystringval); }
datatype_definition
;
datatype_definition
: /* empty */
| LBRACE RBRACE
| LBRACE datatype_attribute_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
datatype_attribute_list
: datatype_attribute
| datatype_attribute_list datatype_attribute
;
datatype_attribute
: datatype_attribute_name
EQUALS
STRING
{ wmlAddDatatypeAttribute (yytknval1, yystringval); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
datatype_attribute_name
: INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
| DOCNAME { yytknval1 = DOCNAME; }
| XRMRESOURCE { yytknval1 = XRMRESOURCE; }
;
/*
* The CONTROLLIST statement
*/
ctrlist_statement
: name
{ wmlCreateOrAppendCtrlList (yynameval); }
ctrlist_definition
;
ctrlist_definition
: /* empty */
| LBRACE RBRACE
| LBRACE ctrlist_controls_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
ctrlist_controls_list
: ctrlist_control
| ctrlist_controls_list ctrlist_control
;
ctrlist_control
: name
{ wmlAddCtrlListControl (yynameval); }
ctrlist_controls_attributes
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
ctrlist_controls_attributes
: /* empty */
| LBRACE RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
/*
* The ENUMERATIONSET statement
*/
enumset_statement
: name
COLON
enumset_data_type
{ wmlCreateEnumSet (yynameval, yystringval); }
enumset_definition
;
enumset_data_type
:
STRING
;
enumset_definition
: /* empty */
| LBRACE RBRACE
| LBRACE enumset_value_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
enumset_value_list
: enumset_value
| enumset_value_list enumset_value
;
enumset_value
: name
{ wmlAddEnumSetValue (yynameval); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
/*
* The ENUMERATIONVALUE statement
*/
enumval_statement
: name
COLON
{ wmlCreateEnumValue (yynameval); }
enumvalue_definition
;
enumvalue_definition
: /* empty */
| LBRACE RBRACE
| LBRACE enumvalue_attributes_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
enumvalue_attributes_list
: enumvalue_attribute
| enumvalue_attributes_list enumvalue_attribute
;
enumvalue_attribute
: enumvalue_attribute_name
EQUALS
STRING
{ wmlAddEnumValueAttribute (yytknval1, yystringval); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
enumvalue_attribute_name
: ENUMLITERAL { yytknval1 = ENUMLITERAL; }
;
/*
* CHARACTERSET statement
*/
charset_statement
: name
{ wmlCreateCharset (yystringval); }
charset_definition
;
charset_definition
: /* empty */
| LBRACE RBRACE
| LBRACE charset_attribute_list RBRACE
| error { LexIssueError(RBRACE); } RBRACE
;
charset_attribute_list
: charset_attribute
| charset_attribute_list charset_attribute
;
charset_attribute
: charset_attribute_name
EQUALS
STRING
{ wmlAddCharsetAttribute (yytknval1, yystringval); }
SEMICOLON
| predefined_charset_attribute_name
EQUALS
predefined_charset_attribute_value
{ wmlAddCharsetAttribute (yytknval1, yytknval2); }
SEMICOLON
| error { LexIssueError(SEMICOLON); } SEMICOLON
;
charset_attribute_name
: INTERNALLITERAL { yytknval1 = INTERNALLITERAL; }
| ALIAS { yytknval1 = ALIAS; }
| XMSTRINGCHARSETNAME { yytknval1 = XMSTRINGCHARSETNAME; }
;
predefined_charset_attribute_name
: DIRECTION { yytknval1 = DIRECTION; }
| PARSEDIRECTION { yytknval1 = PARSEDIRECTION; }
| CHARACTERSIZE { yytknval1 = CHARACTERSIZE; }
;
predefined_charset_attribute_value
: LEFTTORIGHT { yytknval2 = LEFTTORIGHT; }
| RIGHTTOLEFT { yytknval2 = RIGHTTOLEFT; }
| ONEBYTE { yytknval2 = ONEBYTE; }
| TWOBYTE { yytknval2 = TWOBYTE; }
| MIXED1_2BYTE { yytknval2 = MIXED1_2BYTE; }
/*
* Other productions
*/
name
: STRING
{ strcpy (yynameval, (XmConst char *)yystringval); }
;
%%
/*
* Dummmy error routine, since we output our own.
*/
int yyerror (s)
char *s;
{
return 0;
}
#include "wmllex.c"