public void ParserExpCollection() { string sourceCode = "10 A = 1 + 1 - 2 \n" + "20 A = A + 1 * 7 \n" + "30 A = 1 + A / 8 - ( 11 + 2 ) \n" + "40 A = -(A + A) * C \n" + "50 A = A - C * 1 + B \n" + "60 A = \"TT\" + \"FF\" \n" + "70 A = 7 + B : B = 1 + 9 \n" + "80 A = 1 + 1 + 2 + A:B = 11 + 9"; Tokenizer tokenizer = new Tokenizer(sourceCode); Parser parser = new Parser(tokenizer); parser.Parsing(); // check statement List<Statement> statements = parser.STATEMENTS; if (statements.Count != 10) throw new Exception("statement count incorrect."); //TODO }
/// <summary> /// print tokenizer /// </summary> /// <param name="tokenizer"></param> protected void printTokens(Tokenizer tok) { tok.Reset(); int lineNum = 1; Token t = tok.GetToken(); // parse to tokens while (t.m_type != Token.FILE_END) { // end of line if (t.m_type == Token.EOL) { System.Console.Write("\n"); lineNum++; } // error handler else if (t.m_type == Token.ERROR) { throw new Exception("Error token in line " + lineNum); } else { if (t.m_type == Token.INT) System.Console.Write(t.m_intVal + " "); else if (t.m_type == Token.FLOAT) System.Console.Write(t.m_floatVal + " "); else if (t.m_type == Token.SYMBOL) System.Console.Write(t.m_strVal + " "); else System.Console.Write(t.m_type.ToString() + " "); } t = tok.GetToken(); } }
static void Main(string[] args) { string path = null; if (args.Length > 0) path = args [0]; else path = "../../../../Bas/_tank.bas"; // print the file path System.Console.WriteLine("Run file: " + path); // read the source string sourceCode = System.IO.File.ReadAllText(path); // lex Tokenizer tok = new Tokenizer(sourceCode); // parser Parser parser = new Parser(tok); // runtime Runtime rt = new Runtime(parser); rt.SetAPI(new DebugAPI()); rt.Run(); // wait for key press System.Console.ReadKey(); }
public void ShowTokens() { string path = "../../../../Bas/_tank.bas"; // read the source string sourceCode = System.IO.File.ReadAllText(path); // tokenizer Tokenizer tok = new Tokenizer(sourceCode); printTokens(tok); }
/// <summary> /// run the program /// </summary> /// <param name="code"></param> static public DebugAPI RunProgram( string code ) { Tokenizer tokenizer = new Tokenizer(code); Parser parser = new Parser(tokenizer); Runtime rt = new Runtime(parser); DebugAPI api = new DebugAPI(); rt.SetAPI(api); rt.Run(); while (!rt.Step()) ; return api; }
public void Tokenizer() { string sourceCode = "testSymbol #1 123 17.0 \"hjb\" \r\n" + "+-*/^" + "=>< >=<=<>" + "AND OR NOT" + ";,:()" + "LET DIM READ DATA RESTORE GOTO " + "IF THEN ELSE FOR NEXT " + "WHILE WEND TO STEP " + "DEF FN GOSUB RETURN ON " + "REM this is comment \r\n" + // REM will be skip , replace with a EOL "PRINT OPEN CLOSE FIELD " + "GET LSET PUT RSET WRITE " + "INPUT INKEY$ " + "" + //TODO "@"; int[] typeList = new int[] { Token.SYMBOL, Token.FILE_NUM, Token.INT, Token.FLOAT, Token.STRING, Token.EOL, Token.PLUS, Token.MINUS, Token.MUL, Token.DIV, Token.POWER, Token.EQUAL, Token.GTR, Token.LT, Token.GTE, Token.LTE, Token.NEG, Token.AND, Token.OR, Token.NOT, Token.SEMI, Token.COMMA, Token.COLON, Token.LEFT_PAREN, Token.RIGHT_PAREN, Token.LET, Token.DIM, Token.READ, Token.DATA, Token.RESTORE, Token.GOTO, Token.IF, Token.THEN, Token.ELSE, Token.FOR, Token.NEXT, Token.WHILE, Token.WEND, Token.TO, Token.STEP, Token.DEF, Token.FN, Token.GOSUB, Token.RETURN, Token.ON, Token.EOL, Token.PRINT, Token.OPEN, Token.CLOSE, Token.FIELD, Token.GET, Token.LSET, Token.PUT, Token.RSET, Token.WRITE, Token.INPUT, Token.INKEY, //TODO Token.ERROR, Token.FILE_END }; Tokenizer tokenizer = new Tokenizer( sourceCode ); for (int i = 0; i < typeList.Length; i++ ) { Token tok = tokenizer.GetToken(); if (tok.m_type != typeList[i]) throw new Exception("Token type incorrect. Must be " + typeList[i].ToString()); } }
public void ParserIf() { string sourceCode = @"10 IF A>1 THEN PRINT C 20 IF C=2 THEN PRINT 11 ELSE PRINT 22 30 IF B<=1 GOTO 13 40 IF E>0 GOTO 11 ELSE 70 50 IF F < 6 AND G > 8 THEN PRINT theStr:C=17 ELSE 70"; Tokenizer tokenizer = new Tokenizer(sourceCode); Parser parser = new Parser(tokenizer); parser.Parsing(); // check statement List<Statement> statements = parser.STATEMENTS; if (statements.Count != 5) throw new Exception("statement count incorrect."); //TODO }
/// <summary> /// constructor /// </summary> /// <param name="tokenizer"></param> public Parser( Tokenizer tokenizer, int k = 10 ) { m_tokenizer = tokenizer; m_tokenBuff = new Token[k]; }