208 lines
2.9 KiB
Plaintext
208 lines
2.9 KiB
Plaintext
%{
|
|
#include <stdio.h>
|
|
|
|
extern void beginScope( int );
|
|
extern void endScope();
|
|
extern void addText( const char* );
|
|
|
|
%}
|
|
|
|
%error-verbose
|
|
|
|
// Symbols.
|
|
%union
|
|
{
|
|
char *sval;
|
|
};
|
|
|
|
%token <sval> TEXT
|
|
%token INTERFACE
|
|
%token CLASS
|
|
%token BASE
|
|
%token QMLCLASS
|
|
%token QMLBASE
|
|
%token HEADER
|
|
%token NAME
|
|
%token TYPE
|
|
%token READ
|
|
%token WRITE
|
|
%token NOTIFY
|
|
%token ENUM
|
|
%token PROPERTY
|
|
%token FUNCTION
|
|
%token INVOKABLE
|
|
%token SIGNAL
|
|
%token SLOT
|
|
%token SIGNATURE
|
|
%token DESCRIPTION
|
|
%token END
|
|
|
|
%start Interfaces
|
|
%%
|
|
|
|
Interfaces:
|
|
| Interfaces Interface;
|
|
|
|
Interface:
|
|
INTERFACE { beginScope( INTERFACE ); }
|
|
InterfaceParts
|
|
End
|
|
|
|
InterfaceParts:
|
|
| InterfaceParts InterfacePart
|
|
|
|
InterfacePart:
|
|
Class | Base | QmlClass | QmlBase | Header | Description
|
|
| Enum | Property | Function | Invokable | Slots | Signals
|
|
|
|
Enum:
|
|
ENUM { beginScope( ENUM ); }
|
|
EnumParts
|
|
End
|
|
|
|
EnumParts:
|
|
| EnumParts EnumPart
|
|
|
|
EnumPart:
|
|
Class | QmlClass | Description
|
|
|
|
Property:
|
|
PROPERTY { beginScope( PROPERTY ); }
|
|
PropertyParts
|
|
End
|
|
|
|
PropertyParts:
|
|
| PropertyParts PropertyPart
|
|
|
|
PropertyPart:
|
|
Name | Type | Read | Write | Notify | Description
|
|
|
|
Function:
|
|
FUNCTION { beginScope( FUNCTION ); }
|
|
FunctionParts
|
|
End
|
|
|
|
Invokable:
|
|
INVOKABLE { beginScope( INVOKABLE ); }
|
|
FunctionParts
|
|
End
|
|
|
|
Slots:
|
|
SLOT { beginScope( SLOT ); }
|
|
FunctionParts
|
|
End
|
|
|
|
Signals:
|
|
SIGNAL { beginScope( SIGNAL ); }
|
|
FunctionParts
|
|
End
|
|
|
|
FunctionParts:
|
|
Signature Description
|
|
|
|
Signature:
|
|
SIGNATURE { beginScope( SIGNATURE ); }
|
|
Textlines
|
|
End
|
|
|
|
Description:
|
|
DESCRIPTION { beginScope( DESCRIPTION ); }
|
|
Textlines
|
|
End
|
|
|
|
Class:
|
|
CLASS { beginScope( CLASS ); }
|
|
Textline
|
|
End
|
|
|
|
Base:
|
|
BASE { beginScope( BASE ); }
|
|
Textline
|
|
End
|
|
|
|
QmlClass:
|
|
QMLCLASS { beginScope( QMLCLASS ); }
|
|
Textline
|
|
End
|
|
|
|
QmlBase:
|
|
QMLBASE { beginScope( QMLBASE ); }
|
|
Textline
|
|
End
|
|
|
|
Header:
|
|
HEADER { beginScope( HEADER ); }
|
|
Textline
|
|
End
|
|
|
|
Name:
|
|
NAME { beginScope( NAME ); }
|
|
Textline
|
|
End
|
|
|
|
Type:
|
|
TYPE { beginScope( TYPE ); }
|
|
Textline
|
|
End
|
|
|
|
Read:
|
|
READ { beginScope( READ ); }
|
|
Textline
|
|
End
|
|
|
|
Write:
|
|
WRITE { beginScope( WRITE ); }
|
|
Textline
|
|
End
|
|
|
|
Notify:
|
|
NOTIFY { beginScope( NOTIFY ); }
|
|
Textline
|
|
End
|
|
|
|
Textlines:
|
|
| Textlines Textline
|
|
|
|
Textline:
|
|
TEXT { addText( $1 ); }
|
|
|
|
End:
|
|
END { endScope(); }
|
|
|
|
%%
|
|
|
|
#include "metadox.lex.h"
|
|
#include "metadox.tab.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
int yyerror( const char *s )
|
|
{
|
|
printf("Error at line %d: %s\n", yylineno, s);
|
|
return 0;
|
|
}
|
|
|
|
int metadoxCompile( const char* fileName )
|
|
{
|
|
int ok;
|
|
FILE *fp = 0;
|
|
|
|
/*yydebug = 1; */
|
|
if ( fileName )
|
|
{
|
|
fp = fopen( fileName, "r" );
|
|
yyin = fp;
|
|
ok = yyparse();
|
|
fclose(fp);
|
|
}
|
|
else
|
|
{
|
|
ok = yyparse();
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
|