/*************************************************************************** * Copyright (C) 2004-2005 by Daniel Clarke * * daniel.jc@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef MICROBE_H #define MICROBE_H #include #include // #include #include #include #include class TQString; class BTreeBase; class BTreeNode; class Code; class PIC14; class PortPin; typedef TQValueList PortPinList; typedef TQValueList VariableList; typedef TQMap AliasMap; enum ExprType { unset = 1, working = 2, number = 3, variable = 4, extpin = 5, keypad = 6, }; class SourceLine; typedef TQValueList SourceLineList; /** Represents a source line, with the convention of line number starting at zero. @author David Saxton */ class SourceLine { public: /** * The TQValueList template requires a default constructor - calling this * though creates an invalid SourceLine with line() returning -1. So * this constructor should never be used. */ SourceLine(); SourceLine( const TQString & text, const TQString & url, int line ); TQString text() const { return m_text; } TQString url() const { return m_url; } int line() const { return m_line; } /** * Extracts the text from each SourceLine and adds it to the * returned TQStringList. */ static TQStringList toStringList( const SourceLineList & lines ); protected: TQString m_text; TQString m_url; int m_line; }; /** @author Daniel Clarke @author David Saxton */ class Microbe { public: Microbe(); ~Microbe(); enum MistakeType { UnknownStatement = 1, InvalidPort = 2, UnassignedPin = 3, // pin identifier without an "= something" NonHighLowPinState = 4, UnassignedPort = 5, // port identifier without an "= something" UnexpectedStatementBeforeBracket = 6, MismatchedBrackets = 7, InvalidEquals = 8, ReservedKeyword = 9, ConsecutiveOperators = 10, MissingOperator = 11, UnknownVariable = 12, UnopenableInclude = 16, DivisionByZero = 17, NumberTooBig = 18, NonConstantStep = 19, NonConstantDelay = 20, HighLowExpected = 21, InvalidComparison = 22, SubBeforeEnd = 23, LabelExpected = 24, TooManyTokens = 25, FixedStringExpected = 26, PinListExpected = 27, AliasRedefined = 28, InvalidInterrupt = 29, InterruptRedefined = 30, InterruptBeforeEnd = 31, ReadOnlyVariable = 32, WriteOnlyVariable = 33, InvalidPinMapSize = 34, VariableRedefined = 35, InvalidVariableName = 36, VariableExpected = 40, NameExpected = 41 }; /** * Returns a list of errors occured during compilation, intended for * outputting to stderr. */ TQString errorReport() const { return m_errorReport; } /** * Call this to compile the given code. This serves as the top level of * recursion as it performs initialisation of things, to recurse at * levels use parseUsingChild(), or create your own Parser. * @param url is used for reporting errors */ TQString compile( const TQString & url, bool showSource, bool optimize ); /** * Adds the given compiler error at the file line number to the * compilation report. */ void compileError( MistakeType type, const TQString & context, const SourceLine & sourceLine ); /** * This is for generating unique numbers for computer generated labels. */ TQString uniqueLabel() { return TQString("__%1").arg(m_uniqueLabel++); } /** * If alias is an alias for something then it returns that something, * otherwise it just returns alias (which in that case is not an alias!) */ TQString alias( const TQString & alias ) const; /** * Aliases the name to the dest. */ void addAlias( const TQString & name, const TQString & dest ); /** * Tell Microbe that a minimum of the given delay routine needs to be * created. * @see PIC14::DelaySubroutine * @param routine - DelaySubroutine enum, higher is more priority */ void addDelayRoutineWanted( unsigned routine ); /** * Makes a new PIC assembly object, based on the PIC string that the * user has given in the source. */ PIC14 * makePic(); /** * Add the interrupt as being used, i.e. make sure there is one and only * one occurance of its name in m_usedInterrupts. */ void setInterruptUsed( const TQString & interruptName ); /** * @returns whether the given interrupt has already been used. */ bool isInterruptUsed( const TQString & interruptName ); /** * @returns whether the variable name is valid. */ static bool isValidVariableName( const TQString & variableName ); /** * Appends the given variable name to the variable list. */ void addVariable( const Variable & variable ); /** * @returns the variable with the given name, or one of invalidType if * no such variable exists. */ Variable variable( const TQString & variableName ) const; /** * @returns whether the variable has been declared yet. */ bool isVariableKnown( const TQString & variableName ) const; /** * This is used as a temporary variable while evaluating an expression. */ TQString dest() const; void incDest(); void decDest(); void resetDest(); protected: /** * Strips comments from m_program, simplifies the white space in each line, * puts braces on separate lines, and then removes any blank lines. */ void simplifyProgram(); TQStringList m_usedInterrupts; SourceLineList m_program; TQString m_errorReport; int m_uniqueLabel; VariableList m_variables; int m_dest; unsigned m_maxDelaySubroutine; /** * Keeps a list of aliases that have been created which maps the key as * the alias text to the data which is the thing being aliased, so that * something can be aliased to two different things. e.g. * alias ken bob * alias mary bob */ TQMap m_aliasList; /** * Once the child parser has found it, this is set to the pic type * string found in the source file. The pic type directive must be * the first thing in the microbe program, before even includes. * @see PIC14::Type */ int m_picType; }; #endif