MY START to a COMPILER
Posted: Tue May 24, 2011 9:34 pm
Well I said I would post my compiler. It has been a while and I thought this is my start of one so why not?
HOPE YOU like it. Could use a little help with an algorithm I have one not sure about the CODE generation either.
Code: Select all
DECLARE SUB OBTAINCHARACTER (initIndex AS INTEGER)
DECLARE SUB KEYWORD.PARSE (initIndex AS INTEGER, NEWVARIABLE AS STRING_
REMCONDITION AS STRING, CASEWORD AS STRING)
DECLARE SUB VALUE.REM (REMCONDITION AS STRING, CASEWORD AS STRING)
DECLARE SUB VALUE.VARIABLE(CASEWORD AS STRING, VARERROR AS INTEGER_
NEWVARIABLE AS STRING)
REM SMALL MENU FOR CHOICE OF WHAT TO DO (FONT EDITOR)
REM CONNECT PATH TO FILE
REM NEED A WHILE STATEMENT
CALL OBTAINCHARACTER (initIndex)
CALL KEYWORD.PARSE (initIndex, NEWVARIABLE$, REMCONDITION$, CASEWORD$)
IF REMCONDITION$ = "True" THEN CALL VALUE.REM(REMCONDITION$, CASEWORD$)
IF CASEWORD$ = "VARIABLE" THEN CALL VALUE.VARIABLE(CASEWORD$,_
VARERROR%_
NEWVARIABLE$)
CALL ERRORHANDLER(VARERROR%)
REM WEND
REM ALGORITHM
REM CODE GENERATOR
REM COMPILER FOR HEX (done)
END
SUB OBTAINCHARACTER (tknIndex AS INTEGER)
OPEN FileName$ FOR INPUT AS #1
tknIndex = ASC(INPUT$(1, 1))
CLOSE #1
END SUB
SUB KEYWORD.PARSE (tknIndex AS INTEGER, USERVARIABLE AS STRING_
REMSTATEMENT AS STRING, TOKEN AS STRING)
CASECHARACTER$ = "NEARCASE"
STRINGPOINTER% = 2
DIM TKNNAME$(12)
IF STR(tknIndex) = CHR$(10) THEN
TOKEN$ = CHR$(10)
EXIT SUB
END IF
IF STR(tknIndex) = "_" THEN
CONTINUESTRING$ = "True"
TOKEN$ = "_"
EXIT SUB
ELSE
CONTINUESTRING$ = "False"
END IF
IF STR(tknIndex) = CHR$(13) THEN
TOKEN$ = CHR$(13)
EXIT SUB
END IF
IF STR(tknIndex) = "'" THEN
REMSTATEMENT$ = "True"
ELSE
REMSTATEMENT$ = "False"
END IF
' Define command as TOKEN$
OPEN "FileName$" FOR INPUT AS #1
FOR y% = 1 TO STRINGPOINTER%
TKNNAME$(y%) = INPUT$(1, 1)
IF TKNNAME$(y%) > CHR$(64) AND TKNNAME$(y%) <CHR> CHR$(96) AND TKNNAME$(y%) < CHR$(123) THEN
INCR STRINGPOINTER%
TOKEN$ = TOKEN$ + TKNNAME$(y%)
END IF
IF TKNNAME$(y%) = CHR$(34) THEN
INCR STRINGPOINTER%
TOKEN$ = TOKEN$ + TKNNAME$(y%)
IF CHR$(13) OR CHR$(10) = TKNNAME$(y%) AND_
CONTINUESTRING$ = "False" THEN EXIT FOR
NEXT y%
IF TKNNAME$(y%) = " " OR TKNNAME$(y%) = "(" THEN_
CASECHARACTER$ = "FARCASE"
CLOSE #1
STYLECASE$ = LCASE$(TOKEN$)
IF STYLECASE$ = "asm" THEN CALL KEYWORD.asm(tknIndex)
IF STYLECASE$ = "call" THEN CALL KEYWORD.call
IF BUDGET% = 5 THEN USERVARIABLE$ = TOKEN$
END SUB
SUB VALUE.REM(REMSTATEMENT AS STRING, TOKEN AS STRING)
QUOTETH$ = TOKEN$
OPEN FileName$ FOR INPUT AS #1
TEMP$ = ":"
WHILE TEMP$ <> CHR$(10)
TEMP$ = INPUT$(1, 1)
IF TEMP$ <> CHR$(10) THEN QUOTETH$ = QUOTETH$ + TEMP$
WEND
CLOSE #1
END SUB
SUB VALUE.VARIABLE(TOKEN AS STRING, ERRSTATEVAR AS INTEGER_
USERVARIABLE AS STRING)
WHILE TOKEN$ = USERVARIABLE$
OPEN FileName$ FOR INPUT AS #1
GRABCHARACTER$ = INPUT$(1, 1)
IF "=" OR "(" OR CHR$(13) OR "A" OR "a" <> GRABCHARACTER$ THEN
COLOR 5, 0, 0
PRINT "STOPPED COMPILING!!!!"
ERRSTATEVAR = 03
END IF
CLOSE #1
TOKEN$ = GRABCHARACTER$
WEND
END SUB
SUB ERRORHANDLER(ERRSTATEVAR AS INTEGER)
IF ERRSTATEVAR% = 03 THEN_
PRINT "ERROR! USERVARIABLE NOT DEFINED!!!!";
END SUB