From 734521d17ff2c5e91c549e1a37e423e829559c0e Mon Sep 17 00:00:00 2001 From: Thunder422 Date: Fri, 23 Aug 2013 19:44:35 -0400 Subject: [PATCH] implemented support for multiple statement lines added check for colon token statement separator after processing a command to getCommands(), which deletes the colon token and sets new colon sub-code in the last token added to the rpn output list; added end statement flag to colon code in table; added support for new colon sub-colon to token text() function; added new translator test #16 with various colon tests including errors (old translator segfaults on this test) --- ibcp.h | 3 ++- table.cpp | 2 +- test/translator16.dat | 22 +++++++++++++++++++ test/translator16.txt | 49 +++++++++++++++++++++++++++++++++++++++++++ token.cpp | 4 ++++ translator.cpp | 8 ++++++- 6 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 test/translator16.dat create mode 100644 test/translator16.txt diff --git a/ibcp.h b/ibcp.h index 1e299d9..906f29a 100644 --- a/ibcp.h +++ b/ibcp.h @@ -79,7 +79,8 @@ enum SubCode Used_SubCode = 0x00000020, // parentheses used in output Last_SubCode = 0x00000040, // parentheses used as last token End_SubCode = 0x00000080, // end of INPUT parsing codes - UnUsed_SubCode = 0x00000100 // token not in output (for errors) + Colon_SubCode = 0x00000100, // reproduce ":" after token + UnUsed_SubCode = 0x10000000 // token not in output (for errors) }; diff --git a/table.cpp b/table.cpp index b902feb..11c7c6d 100644 --- a/table.cpp +++ b/table.cpp @@ -729,7 +729,7 @@ static TableEntry tableEntries[] = }, { // Colon_Code Operator_TokenType, OneChar_Multiple, - ":", NULL, Null_Flag, 4, None_DataType + ":", NULL, EndStmt_Flag, 4, None_DataType }, { // RemOp_Code Operator_TokenType, OneChar_Multiple, diff --git a/test/translator16.dat b/test/translator16.dat new file mode 100644 index 0000000..9b755b5 --- /dev/null +++ b/test/translator16.dat @@ -0,0 +1,22 @@ +################################################### +# Translator Test #15: Colon Tests (2013-04-05) # +################################################### + +A=SQR(17):PRINT A +PRINT A:PRINT B +PRINT A;:PRINT B +INPUT A:PRINT A +A,B,C=5.0:INPUT D +A$,LEFT$(B$,1),MID$(C$,2,3)="A":PRINT A$ +INPUT PROMPT "Number",A:PRINT A +INPUT PROMPT "Number";A:PRINT A +INPUT PROMPT "Number:";A:PRINT A +INPUT A;:PRINT A +PRINT A:REM output A +PRINT A:'output A:test +INPUT A;:R=SQR(A):PRINT"Sqrt(";A;")=";R + +# colon error tests +: +PRINT: +PRINT::PRINT diff --git a/test/translator16.txt b/test/translator16.txt new file mode 100644 index 0000000..2d1687c --- /dev/null +++ b/test/translator16.txt @@ -0,0 +1,49 @@ + +Input: A=SQR(17):PRINT A +Output: A 17 CvtDbl SQR( Assign':' A PrintDbl PRINT + +Input: PRINT A:PRINT B +Output: A PrintDbl PRINT':' B PrintDbl PRINT + +Input: PRINT A;:PRINT B +Output: A PrintDbl ;':' B PrintDbl PRINT + +Input: INPUT A:PRINT A +Output: InputParse InputBegin A InputAssign INPUT':' A PrintDbl PRINT + +Input: A,B,C=5.0:INPUT D +Output: A B C 5.0 AssignList':' InputParse InputBegin D InputAssign INPUT + +Input: A$,LEFT$(B$,1),MID$(C$,2,3)="A":PRINT A$ +Output: A$ B$ 1 C$ 2 3 "A" AssignKeepMid3 AssignKeepLeft Assign$':' A$ PrintStr PRINT + +Input: INPUT PROMPT "Number",A:PRINT A +Output: "Number" InputParse InputBeginStr'Question' A InputAssign INPUT-PROMPT':' A PrintDbl PRINT + +Input: INPUT PROMPT "Number";A:PRINT A +Output: "Number" InputParse InputBeginStr A InputAssign INPUT-PROMPT':' A PrintDbl PRINT + +Input: INPUT PROMPT "Number:";A:PRINT A +Output: "Number:" InputParse InputBeginStr A InputAssign INPUT-PROMPT':' A PrintDbl PRINT + +Input: INPUT A;:PRINT A +Output: InputParse InputBegin A InputAssign INPUT'Keep:' A PrintDbl PRINT + +Input: PRINT A:REM output A +Output: A PrintDbl PRINT':' REM| output A| + +Input: PRINT A:'output A:test +Output: A PrintDbl PRINT':' '|output A:test| + +Input: INPUT A;:R=SQR(A):PRINT"Sqrt(";A;")=";R +Output: InputParse InputBegin A InputAssign INPUT'Keep:' R A SQR( Assign':' "Sqrt(" PrintStr A PrintDbl ")=" PrintStr R PrintDbl PRINT + +Input: : + ^-- expected command + +Input: PRINT: + ^-- expected command + +Input: PRINT::PRINT + ^-- expected command + diff --git a/token.cpp b/token.cpp index 6de2099..80e9089 100644 --- a/token.cpp +++ b/token.cpp @@ -401,6 +401,10 @@ QString Token::text(void) { string += "Question"; } + if (isSubCode(Colon_SubCode)) + { + string += ":"; + } string += '\''; } return string; diff --git a/translator.cpp b/translator.cpp index 5da261f..aadd71c 100644 --- a/translator.cpp +++ b/translator.cpp @@ -1796,7 +1796,13 @@ TokenStatus Translator::getCommands(Token *&token) { break; } - else + else if (token->isCode(Colon_Code)) + { + // delete uneeded colon token, set colon sub-code on last token + delete token; + outputLastToken()->setSubCodeMask(Colon_SubCode); + } + else // unknown end statement token, return to caller { return Done_TokenStatus; }