summaryrefslogtreecommitdiffstats
path: root/python/sip/sipgen/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'python/sip/sipgen/lexer.l')
-rw-r--r--python/sip/sipgen/lexer.l567
1 files changed, 0 insertions, 567 deletions
diff --git a/python/sip/sipgen/lexer.l b/python/sip/sipgen/lexer.l
deleted file mode 100644
index ef234193..00000000
--- a/python/sip/sipgen/lexer.l
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * The SIP lexer.
- *
- * Copyright (c) 2007
- * Riverbank Computing Limited <info@riverbankcomputing.co.uk>
- *
- * This file is part of SIP.
- *
- * This copy of SIP is licensed for use under the terms of the SIP License
- * Agreement. See the file LICENSE for more details.
- *
- * SIP is supplied WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "sip.h"
-#include "parser.h"
-
-
-#ifndef FLEX_SCANNER
-#error "Only flex is supported at the moment"
-#endif
-
-
-#define YY_FATAL_ERROR(s) fatallex(s)
-
-#define MAX_INCLUDE_DEPTH 10
-#define MAX_CODE_LINE_LENGTH 1000
-
-
-static struct inputFile {
- int lineno; /* The line number. */
- YY_BUFFER_STATE bs; /* The flex buffer state handle. */
- char *name; /* The file name. */
- char *cwd; /* The path part of the file name. */
- parserContext pc; /* The parser context. */
-} inputFileStack[MAX_INCLUDE_DEPTH];
-
-static int currentFile = -1; /* Index of the current input file. */
-static char codeLine[MAX_CODE_LINE_LENGTH + 2]; /* The current code line. */
-static int codeIdx = -1; /* Index of next code character. */
-
-static FILE *openFile(char *);
-static void fatallex(char *);
-%}
-
-%x code
-%x ccomment
-
-%%
-
-^[ \t]*%SIPOptions {return TK_OPTIONS;}
-^[ \t]*%SIPNoEmitters {return TK_NOEMITTERS;}
-^[ \t]*%Include {return TK_INCLUDE;}
-^[ \t]*%OptionalInclude {return TK_OPTINCLUDE;}
-^[ \t]*%Import {return TK_IMPORT;}
-^[ \t]*%Module {return TK_MODULE;}
-^[ \t]*%CModule {return TK_CMODULE;}
-^[ \t]*%Timeline {return TK_TIMELINE;}
-^[ \t]*%Platforms {return TK_PLATFORMS;}
-^[ \t]*%Feature {return TK_FEATURE;}
-^[ \t]*%License {return TK_LICENSE;}
-^[ \t]*%MappedType {return TK_MAPPEDTYPE;}
-^[ \t]*%Exception {return TK_EXCEPTION;}
-^[ \t]*%If {return TK_IF;}
-<INITIAL>^[ \t]*%End {return TK_END;}
-class {return TK_CLASS;}
-struct {return TK_STRUCT;}
-public {return TK_PUBLIC;}
-protected {return TK_PROTECTED;}
-private {return TK_PRIVATE;}
-signals {return TK_SIGNALS;}
-slots {return TK_SLOTS;}
-char {return TK_CHAR;}
-wchar_t {return TK_WCHAR_T;}
-bool {return TK_BOOL;}
-short {return TK_SHORT;}
-int {return TK_INT;}
-long {return TK_LONG;}
-float {return TK_FLOAT;}
-double {return TK_DOUBLE;}
-void {return TK_VOID;}
-virtual {return TK_VIRTUAL;}
-enum {return TK_ENUM;}
-signed {return TK_SIGNED;}
-unsigned {return TK_UNSIGNED;}
-const {return TK_CONST;}
-static {return TK_STATIC;}
-true {return TK_TRUE;}
-false {return TK_FALSE;}
-NULL {return TK_NULL;}
-typedef {return TK_TYPEDEF;}
-namespace {return TK_NAMESPACE;}
-operator {return TK_OPERATOR;}
-throw {return TK_THROW;}
-explicit {return TK_EXPLICIT;}
-template {return TK_TEMPLATE;}
-:: {return TK_SCOPE;}
-\|\| {return TK_LOGICAL_OR;}
-SIP_PYOBJECT {return TK_PYOBJECT;}
-SIP_PYTUPLE {return TK_PYTUPLE;}
-SIP_PYLIST {return TK_PYLIST;}
-SIP_PYDICT {return TK_PYDICT;}
-SIP_PYCALLABLE {return TK_PYCALLABLE;}
-SIP_PYSLICE {return TK_PYSLICE;}
-SIP_PYTYPE {return TK_PYTYPE;}
-SIP_SIGNAL {return TK_SIPSIGNAL;}
-SIP_SLOT {return TK_SIPSLOT;}
-SIP_ANYSLOT {return TK_SIPANYSLOT;}
-SIP_RXOBJ_CON {return TK_SIPRXCON;}
-SIP_RXOBJ_DIS {return TK_SIPRXDIS;}
-SIP_SLOT_CON {return TK_SIPSLOTCON;}
-SIP_SLOT_DIS {return TK_SIPSLOTDIS;}
-SIP_QOBJECT {return TK_QOBJECT;}
-\.\.\. {return TK_ELLIPSIS;}
-
-
-[ \t\r] { /* Ignore whitespace. */
- ;
-}
-
-\n { /* Maintain the line number. */
- ++inputFileStack[currentFile].lineno;
-
- if (codeIdx == 0)
- {
- BEGIN code;
- }
-}
-
-\/\/.* { /* Ignore C++ style comments. */
- ;
-}
-
-
--?[0-9]+ { /* A signed decimal number. */
- yylval.number = strtol(yytext,NULL,0);
- return TK_NUMBER;
-}
-
-
--?(([0-9]+)|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {/* A floating point number. */
- yylval.real = strtod(yytext,NULL);
- return TK_REAL;
-}
-
-
-0x[0-9a-fA-F]+ { /* An unsigned hexadecimal number. */
- yylval.number = strtol(yytext,NULL,16);
- return TK_NUMBER;
-}
-
-
-[_A-Za-z][_A-Za-z0-9]* { /* An identifier name. */
- yylval.text = sipStrdup(yytext);
- return TK_NAME;
-}
-
-
-[._A-Za-z][._/A-Za-z0-9\-]*[._A-Za-z0-9] { /* A relative pathname. */
- yylval.text = sipStrdup(yytext);
- return TK_PATHNAME;
-}
-
-
-\"[^"\n]*["\n] { /* A double-quoted string. */
- char *dp, *sp;
-
- /* Copy the string without the quotes. */
-
- yylval.text = sipMalloc(strlen(yytext) + 1);
-
- dp = yylval.text;
- sp = yytext;
-
- while (*sp != '\0')
- {
- if (*sp != '"')
- *dp++ = *sp;
-
- ++sp;
- }
-
- *dp = '\0';
-
- return TK_STRING;
-}
-
-
-\'[^'\n]*['\n] { /* A single-quoted character. */
- if (strlen(yytext) != 3)
- fatallex("Exactly one character expected between single quotes");
-
- yylval.qchar = yytext[1];
-
- return TK_QCHAR;
-}
-
-
-\/\* { /* Ignore C-style comments. */
- BEGIN ccomment;
-}
-<ccomment>\n {
- ++inputFileStack[currentFile].lineno;
-}
-<ccomment>\*\/ {
- BEGIN INITIAL;
-}
-<ccomment>. {
- ;
-}
-
-
-^%Copying { /* The software license. */
- codeIdx = 0;
- return TK_COPYING;
-}
-
-^%ConvertFromTypeCode { /* The start of a from-type code block. */
- codeIdx = 0;
- return TK_FROMTYPE;
-}
-
-^%ConvertToTypeCode { /* The start of a to-type code block. */
- codeIdx = 0;
- return TK_TOTYPE;
-}
-
-^%ConvertToSubClassCode { /* The start of a to-sub-class code block. */
- codeIdx = 0;
- return TK_TOSUBCLASS;
-}
-
-^%ExportedHeaderCode { /* The start of an exported header code block. */
- codeIdx = 0;
- return TK_EXPHEADERCODE;
-}
-
-^%ModuleHeaderCode { /* The start of a module header code block. */
- codeIdx = 0;
- return TK_MODHEADERCODE;
-}
-
-^%TypeHeaderCode { /* The start of a type header code block. */
- codeIdx = 0;
- return TK_TYPEHEADERCODE;
-}
-
-^%PreInitialisationCode { /* The start of a pre-initialisation code block. */
- codeIdx = 0;
- return TK_PREINITCODE;
-}
-
-^%PostInitialisationCode { /* The start of a post-initialisation code block. */
- codeIdx = 0;
- return TK_POSTINITCODE;
-}
-
-^%UnitCode { /* The start of a unit code block. */
- codeIdx = 0;
- return TK_UNITCODE;
-}
-
-^%ModuleCode { /* The start of a module code block. */
- codeIdx = 0;
- return TK_MODCODE;
-}
-
-^%TypeCode { /* The start of a type code block. */
- codeIdx = 0;
- return TK_TYPECODE;
-}
-
-^%MethodCode { /* The start of a C++ method code block. */
- codeIdx = 0;
- return TK_METHODCODE;
-}
-
-^%VirtualCatcherCode { /* The start of a C++ virtual code block. */
- codeIdx = 0;
- return TK_VIRTUALCATCHERCODE;
-}
-
-^%GCTraverseCode { /* The start of a traverse code block. */
- codeIdx = 0;
- return TK_TRAVERSECODE;
-}
-
-^%GCClearCode { /* The start of a clear code block. */
- codeIdx = 0;
- return TK_CLEARCODE;
-}
-
-^%BIGetReadBufferCode { /* The start of a read buffer code block. */
- codeIdx = 0;
- return TK_READBUFFERCODE;
-}
-
-^%BIGetWriteBufferCode { /* The start of a write buffer code block. */
- codeIdx = 0;
- return TK_WRITEBUFFERCODE;
-}
-
-^%BIGetSegCountCode { /* The start of a segment count code block. */
- codeIdx = 0;
- return TK_SEGCOUNTCODE;
-}
-
-^%BIGetCharBufferCode { /* The start of a char buffer code block. */
- codeIdx = 0;
- return TK_CHARBUFFERCODE;
-}
-
-^%PrePythonCode { /* The start of a pre-Python code block. */
- codeIdx = 0;
- return TK_PREPYCODE;
-}
-
-^%RaiseCode { /* The start of a raise exception code block. */
- codeIdx = 0;
- return TK_RAISECODE;
-}
-
-^%Doc { /* The start of a documentation block. */
- codeIdx = 0;
- return TK_DOC;
-}
-
-^%ExportedDoc { /* The start of an exported documentation block. */
- codeIdx = 0;
- return TK_EXPORTEDDOC;
-}
-
-^%Makefile { /* The start of a Makefile code block. */
- codeIdx = 0;
- return TK_MAKEFILE;
-}
-
-^%AccessCode { /* The start of an access code block. */
- codeIdx = 0;
- return TK_ACCESSCODE;
-}
-
-^%GetCode { /* The start of a get code block. */
- codeIdx = 0;
- return TK_GETCODE;
-}
-
-^%SetCode { /* The start of a set code block. */
- codeIdx = 0;
- return TK_SETCODE;
-}
-
-<code>^%End { /* The end of a code block. */
- BEGIN INITIAL;
- codeIdx = -1;
- return TK_END;
-}
-
-<code>\n { /* The end of a code line . */
- struct inputFile *ifp;
-
- codeLine[codeIdx] = '\n';
- codeLine[codeIdx + 1] = '\0';
- codeIdx = 0;
-
- ifp = &inputFileStack[currentFile];
-
- yylval.codeb = sipMalloc(sizeof (codeBlock));
-
- yylval.codeb -> frag = sipStrdup(codeLine);
- yylval.codeb -> linenr = ifp -> lineno++;
- yylval.codeb -> filename = sipStrdup(ifp -> name);
- yylval.codeb -> next = NULL;
-
- return TK_CODELINE;
-}
-
-<code>. { /* The contents of a code line. */
- if (codeIdx == MAX_CODE_LINE_LENGTH)
- fatallex("Line is too long");
-
- codeLine[codeIdx++] = yytext[0];
-}
-
-. { /* Anything else is returned as is. */
- return yytext[0];
-}
-
-%%
-
-/*
- * Hook into EOF handling. Return 0 if there is more to process.
- */
-
-int yywrap()
-{
- char *cwd;
- struct inputFile *ifp;
-
- if ((cwd = inputFileStack[currentFile].cwd) != NULL)
- free(cwd);
-
- ifp = &inputFileStack[currentFile--];
-
- /* Tell the parser if this is the end of a file. */
-
- parserEOF(ifp -> name,&ifp -> pc);
-
- /* Tidy up this file. */
-
- fclose(yyin);
- free(ifp -> name);
-
- /* See if this was the original file. */
-
- if (currentFile < 0)
- return 1;
-
- yy_delete_buffer(YY_CURRENT_BUFFER);
- yy_switch_to_buffer(ifp -> bs);
-
- return 0;
-}
-
-
-/*
- * Set up an input file to be read by the lexer, opening it if necessary.
- */
-void setInputFile(FILE *fp,char *name,parserContext *pc,int optional)
-{
- char *fullname = NULL;
-
- if (currentFile >= MAX_INCLUDE_DEPTH - 1)
- fatal("Too many nested %%Include, %%OptionalInclude or %%Import statements\n");
-
- if (fp != NULL || (fp = openFile(name)) != NULL)
- fullname = sipStrdup(name);
- else
- {
- char *cwd;
-
- /* Try the directory that contains the current file. */
- if (currentFile >= 0 && (cwd = inputFileStack[currentFile].cwd) != NULL)
- {
- fullname = concat(cwd,"/",name,NULL);
-
- if ((fp = openFile(fullname)) == NULL)
- {
- free(fullname);
- fullname = NULL;
- }
- }
- }
-
- /* Try the include path if we haven't found anything yet. */
- if (fullname == NULL)
- {
- stringList *sl;
-
- fullname = NULL;
-
- for (sl = includeDirList; sl != NULL; sl = sl -> next)
- {
- if (fullname != NULL)
- free(fullname);
-
- fullname = concat(sl -> s,"/",name,NULL);
-
- if ((fp = openFile(fullname)) != NULL)
- break;
- }
-
- if (fp == NULL && !optional)
- fatal("Unable to find file \"%s\"\n",name);
- }
-
- if (fp != NULL)
- {
- char *cwd;
-
- yyin = fp;
-
- ++currentFile;
-
- /*
- * Remember the directory containing the new file and make it
- * "current".
- */
- if ((cwd = strchr(fullname,'/')) != NULL)
- {
- cwd = sipStrdup(fullname);
- *strrchr(cwd,'/') = '\0';
- }
-
- inputFileStack[currentFile].lineno = 1;
- inputFileStack[currentFile].name = fullname;
- inputFileStack[currentFile].pc = *pc;
- inputFileStack[currentFile].cwd = cwd;
-
- if (currentFile > 0)
- {
- inputFileStack[currentFile].bs = YY_CURRENT_BUFFER;
- yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
- }
- }
-}
-
-
-/*
- * Open a file for reading or return NULL if it doesn't exist. Any other error
- * is fatal.
- */
-static FILE *openFile(char *name)
-{
- FILE *fp;
-
- if ((fp = fopen(name,"r")) == NULL && errno != ENOENT)
- fatal("Error in opening file %s\n",name);
-
- return fp;
-}
-
-
-/*
- * Handle fatal yacc errors.
- */
-void yyerror(char *s)
-{
- if (currentFile < 0)
- fatal("%s\n", s);
-
- fatal("%s:%d: %s\n",
- inputFileStack[currentFile].name,
- inputFileStack[currentFile].lineno,
- s);
-}
-
-
-/*
- * Handle warnings while parsing.
- */
-void yywarning(char *s)
-{
- warning("%s:%d: %s\n",
- inputFileStack[currentFile].name,
- inputFileStack[currentFile].lineno,
- s);
-}
-
-
-/*
- * Handle fatal lex errors.
- */
-static void fatallex(char *s)
-{
- fatal("%s:%d: Lexical analyser error: %s\n",
- inputFileStack[currentFile].name,
- inputFileStack[currentFile].lineno,
- s);
-}