The Basic Progamming Language is obsolete, replaced long ago with Visual Basic and its variants. This page shows the Program Grammar (Programmar) for Basic. The complete Basic Programmar is available in this zip file: here It includes all the Interpretation logic to run some old Basic programs.
Here is a sample Basic program from 1972, running on a DEC PDP 8/E with 4K 12-bit total memory, no disk, ticker tape for storage, thermal paper instead of a display screen. The computer was about the size of a small suitcase. To start the computer, we had to use the 12 toggles on the front to enter a series of codes that enabled the ticker tape reader, which we then used to load the operating system.
Basic Programming Language
|
Main DirectoryBasic_Expression.javapublic class Basic_Expression extends PrecedenceChooser { private static OperatorList _operators = new OperatorList(); public Basic_Expression() { super(_operators); } public Basic_Expression(PrecedenceOperator token, AllowedPrecedence allowed) { super(_operators, allowed, token.getClass()); } // // Note: All fields should stay in @P(#) order. // The # determines operator precedence. // /////////////////////////////////////////////// // Terminals public @P(10) Basic_Number number; public @P(20) Basic_Literal literal; /////////////////////////////////////////////// // Primary expressions public @P(100) Basic_NegativeExpression negativeExpression; public @P(110) Basic_ParenthesizedExpression parenthesizedExpression; public @P(120) Basic_AbsFunction absFunction; public @P(130) Basic_ChrFunction chrFunction; public @P(140) Basic_IntFunction intFunction; public @P(150) Basic_RndFunction rndFunction; public @P(160) Basic_TabFunction tabFunction; public @P(170) Basic_TrigFunction trigFunction; public @P(180) Basic_VariableExpression variableExpression; /////////////////////////////////////////////// // Binary expressions public @P(1000) Basic_SubscriptExpression subscriptExpression; public @P(1010) Basic_ExponentExpression exponentExpression; public @P(1020) Basic_MultiplicativeExpression multiplicativeExpression; public @P(1030) Basic_AdditiveExpression additiveExpression; public @P(1040) Basic_RelationalExpression relationalExpression; } Basic_Program.javapublic class Basic_Program extends AbstractLanguage { public static final String BASIC = "Basic"; public Basic_Program() { super(BASIC, new Basic_Syntax()); } public @S(10) @OPT TokenList<Basic_Statement> statements; } Basic_Reserved_Words.javapublic class Basic_Reserved_Words { public static final String[] RESERVED_WORDS = new String[] { "ABS", "CHR$", "DAT", "DIM", "END", "FOR", "GOSUB", "INPUT", "INP", "INT", "NEXT", "NEX", "PRINT", "PRI", "REM", "RETURN", "STEP", "THEN", "THE", "TO", }; } Basic_Statement.javapublic class Basic_Statement extends TokenSequence { public @S(10) Basic_Number label; public @S(20) SeparatedList<Basic_BaseStatement,PunctuationBackSlash> statements; public @S(30) Basic_EndOfLine eoln; public static class Basic_BaseStatement extends TokenChooser { public @CHOICE Basic_DataStatement XXdataStatement; public @CHOICE Basic_DimStatement XXdimStatement; public @CHOICE Basic_EndStatement XXendStatement; public @CHOICE Basic_ForStatement XXforStatement; public @CHOICE Basic_GoSubStatement XXgosubStatement; public @CHOICE Basic_GoToStatement XXgotoStatement; public @CHOICE Basic_IfStatement XXifStatement; public @CHOICE Basic_InputStatement XXinputStatement; public @CHOICE Basic_OnGoToStatement XXongotoStatement; public @CHOICE Basic_PrintStatement XXprintStatement; public @CHOICE Basic_ReadStatement XXreadStatement; public @CHOICE Basic_RemStatement XXremStatement; public @CHOICE Basic_ReturnStatement XXreturnStatement; public @LAST Basic_AssignmentStatement XXassignmentStatement; } } Basic_Variable.javapublic class Basic_Variable extends TokenSequence { public @S(10) Basic_Identifier_Reference var; public @S(20) @OPT Basic_Subscript subscripts; public static class Basic_Subscript extends TokenSequence { public @S(10) PunctuationLeftParen leftParen; public @S(20) SeparatedList<Basic_Expression,PunctuationComma> subs; public @S(30) PunctuationRightParen rightParen; } } Directory: ExpressionsExpressions/Basic_AdditiveExpression.javapublic class Basic_AdditiveExpression extends PrecedenceOperator { public @S(10) Basic_Expression left = new Basic_Expression(this, AllowedPrecedence.ATLEAST); public @S(20) Basic_PunctuationChoice operator = new Basic_PunctuationChoice("+", "-"); public @S(30) Basic_Expression right = new Basic_Expression(this, AllowedPrecedence.HIGHER); } Expressions/Basic_ExponentExpression.javapublic class Basic_ExponentExpression extends PrecedenceOperator { public @S(10) Basic_Expression left = new Basic_Expression(this, AllowedPrecedence.HIGHER); public @S(20) Basic_Punctuation operator = new Basic_Punctuation("^"); public @S(30) Basic_Expression right = new Basic_Expression(this, AllowedPrecedence.ATLEAST); } Expressions/Basic_MultiplicativeExpression.javapublic class Basic_MultiplicativeExpression extends PrecedenceOperator { public @S(10) Basic_Expression left = new Basic_Expression(this, AllowedPrecedence.ATLEAST); public @S(20) Basic_PunctuationChoice operator = new Basic_PunctuationChoice("*", "/"); public @S(30) Basic_Expression right = new Basic_Expression(this, AllowedPrecedence.HIGHER); } Expressions/Basic_NegativeExpression.javapublic class Basic_NegativeExpression extends PrimaryOperator { public @S(10) Basic_Punctuation operator = new Basic_Punctuation("-"); public @S(20) Basic_Expression expr; } Expressions/Basic_ParenthesizedExpression.javapublic class Basic_ParenthesizedExpression extends PrimaryOperator { public @S(10) PunctuationLeftParen leftParen; public @S(20) Basic_Expression expression; public @S(30) PunctuationRightParen rightParen; } Expressions/Basic_RelationalExpression.javapublic class Basic_RelationalExpression extends PrecedenceOperator { public @S(10) Basic_Expression left = new Basic_Expression(this, AllowedPrecedence.ATLEAST); public @S(20) Basic_PunctuationChoice operator = new Basic_PunctuationChoice("=", "<=", ">=", "<>", "<", ">"); public @S(30) Basic_Expression right = new Basic_Expression(this, AllowedPrecedence.HIGHER); } Expressions/Basic_SubscriptExpression.javapublic class Basic_SubscriptExpression extends PrecedenceOperator { public @S(10) Basic_Expression expr = new Basic_Expression(this, AllowedPrecedence.ATLEAST); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression subscr = new Basic_Expression(this, AllowedPrecedence.HIGHER); public @S(40) PunctuationRightParen rightParen; } Expressions/Basic_VariableExpression.javapublic class Basic_VariableExpression extends PrimaryOperator { public @S(10) Basic_Variable variable; } Directory: FunctionsFunctions/Basic_AbsFunction.javapublic class Basic_AbsFunction extends PrimaryOperator { public @S(10) Basic_Keyword ABS = new Basic_Keyword("ABS"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression expr; public @S(40) PunctuationRightParen rightParen; } Functions/Basic_ChrFunction.javapublic class Basic_ChrFunction extends PrimaryOperator { public @S(10) Basic_Keyword CHR = new Basic_Keyword("CHR$"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression expr; public @S(40) PunctuationRightParen rightParen; } Functions/Basic_IntFunction.javapublic class Basic_IntFunction extends PrimaryOperator { public @S(10) Basic_Keyword INT = new Basic_Keyword("INT"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression expr; public @S(40) PunctuationRightParen rightParen; } Functions/Basic_RndFunction.javapublic class Basic_RndFunction extends PrimaryOperator { public @S(10) Basic_Keyword RND = new Basic_Keyword("RND"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Keyword X = new Basic_Keyword("X"); public @S(40) PunctuationRightParen rightParen; } Functions/Basic_TabFunction.javapublic class Basic_TabFunction extends PrimaryOperator { public @S(10) Basic_Keyword TAB = new Basic_Keyword("TAB"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression expr; public @S(40) PunctuationRightParen rightParen; } Functions/Basic_TrigFunction.javapublic class Basic_TrigFunction extends PrimaryOperator { public @S(10) Basic_KeywordChoice TRIG = new Basic_KeywordChoice("SIN", "COS"); public @S(20) PunctuationLeftParen leftParen; public @S(30) Basic_Expression expr; public @S(40) PunctuationRightParen rightParen; } Directory: StatementsStatements/Basic_AssignmentStatement.javapublic class Basic_AssignmentStatement extends TokenSequence { public @S(10) Basic_Variable var; public @S(20) PunctuationEquals equals; public @S(30) Basic_Expression expr; } Statements/Basic_DataStatement.javapublic class Basic_DataStatement extends TokenSequence { public @S(10) Basic_KeywordChoice DATA = new Basic_KeywordChoice("DATA", "DAT"); public @S(20) SeparatedList<Basic_Number,PunctuationComma> values; } Statements/Basic_DimStatement.javapublic class Basic_DimStatement extends TokenSequence { public @S(10) Basic_Keyword DIM = new Basic_Keyword("DIM"); public @S(20) SeparatedList<Basic_DimEntry,PunctuationComma> values; public static class Basic_DimEntry extends TokenSequence { public @S(10) Basic_Identifier_Definition id; public @S(20) PunctuationLeftParen leftParen; public @S(30) SeparatedList<Basic_Expression,PunctuationComma> dimensions; public @S(40) PunctuationRightParen rightParen; } } Statements/Basic_EndStatement.javapublic class Basic_EndStatement extends TokenSequence { public @S(10) Basic_Keyword END = new Basic_Keyword("END"); } Statements/Basic_ForStatement.javapublic class Basic_ForStatement extends TokenSequence { public @S(10) Basic_Keyword FOR = new Basic_Keyword("FOR"); public @S(20) Basic_Identifier_Reference var1; public @S(30) PunctuationEquals equals; public @S(40) Basic_Expression from; public @S(50) Basic_Keyword TO = new Basic_Keyword("TO"); public @S(60) Basic_Expression to; public @S(70) @OPT Basic_ForStep step; // What a mess! rest of this line, some lines, start of line with NEXT on it. Ooof. public @S(80) @OPT Basic_For_PostFor block1; public @S(90) @OPT Basic_EndOfLine eoln; public @S(100) @OPT TokenList<Basic_Statement> statements2; public @S(110) @OPT Basic_Number label; public @S(120) @OPT Basic_For_PreNext block3; public @S(130) @OPT PunctuationBackSlash backSlash; public @S(140) @OPT Basic_For_IfThenNext ifNext; public @S(150) Basic_KeywordChoice NEXT = new Basic_KeywordChoice("NEXT", "NEX"); public @S(160) Basic_Identifier_Reference var2; public static class Basic_ForStep extends TokenSequence { public @S(10) Basic_Keyword STEP = new Basic_Keyword("STEP"); public @S(20) Basic_Expression step; } public static class Basic_For_PostFor extends TokenSequence { public @S(10) TokenList<Basic_For_PostPair> pairs; } public static class Basic_For_PostPair extends TokenSequence { public @S(10) PunctuationBackSlash backSlash; public @S(20) Basic_BaseStatement statement; } public static class Basic_For_PreNext extends TokenSequence { public @S(10) TokenList<Basic_For_PreNextPair> pairs; } public static class Basic_For_PreNextPair extends TokenSequence { public @S(10) Basic_BaseStatement statement; public @S(20) PunctuationBackSlash backSlash; } public static class Basic_For_IfThenNext extends TokenSequence { public @S(10) Basic_Keyword IF = new Basic_Keyword("IF"); public @S(20) Basic_Expression condition; public @S(30) Basic_KeywordChoice THEN = new Basic_KeywordChoice("THEN", "THE"); } } Statements/Basic_GoSubStatement.javapublic class Basic_GoSubStatement extends TokenSequence { public @S(10) Basic_Keyword GOSUB = new Basic_Keyword("GOSUB"); public @S(20) Basic_Number lbl; } Statements/Basic_GoToStatement.javapublic class Basic_GoToStatement extends TokenSequence { public @S(10) Basic_Keyword GOTO = new Basic_Keyword("GOTO"); public @S(20) Basic_Number lbl; } Statements/Basic_IfStatement.javapublic class Basic_IfStatement extends TokenSequence { public @S(10) Basic_Keyword IF = new Basic_Keyword("IF"); public @S(20) Basic_Expression condition; public @S(30) Basic_KeywordChoice THEN = new Basic_KeywordChoice("THEN", "THE"); public @S(40) Basic_IfWhat ifWhat; } Statements/Basic_InputStatement.javapublic class Basic_InputStatement extends TokenSequence { public @S(10) Basic_KeywordChoice INPUT = new Basic_KeywordChoice("INPUT", "INP"); public @S(20) @OPT Basic_Literal prompt; public @S(30) @OPT PunctuationSemicolon semicolon; public @S(40) SeparatedList<Basic_Variable,PunctuationComma> vars; } Statements/Basic_OnGoToStatement.javapublic class Basic_OnGoToStatement extends TokenSequence { public @S(10) Basic_Keyword ON = new Basic_Keyword("ON"); public @S(20) Basic_Expression expr; public @S(30) Basic_Keyword GOTO = new Basic_Keyword("GOTO"); public @S(40) SeparatedList<Basic_Number,PunctuationComma> labels; } Statements/Basic_PrintStatement.javapublic class Basic_PrintStatement extends TokenSequence { public @S(10) Basic_KeywordChoice PRINT = new Basic_KeywordChoice("PRINT", "PRI"); public @S(20) @OPT TokenList<Basic_PrintItem> items; public static class Basic_PrintItem extends TokenChooser { public @CHOICE Basic_Expression XXexpr; public @CHOICE PunctuationSemicolon XXsemicolon; public @CHOICE PunctuationComma XXcomma; } } Statements/Basic_ReadStatement.javapublic class Basic_ReadStatement extends TokenSequence { public @S(10) Basic_Keyword READ = new Basic_Keyword("READ"); public @S(20) SeparatedList<Basic_Variable,PunctuationComma> variables; } Statements/Basic_RemStatement.javapublic class Basic_RemStatement extends TokenSequence { public @S(10) Basic_Keyword REM = new Basic_Keyword("REM"); public @S(20) Basic_Comment comment; } Statements/Basic_ReturnStatement.javapublic class Basic_ReturnStatement extends TokenSequence { public @S(10) Basic_KeywordChoice RETURN = new Basic_KeywordChoice("RETURN", "RET"); } |
Here is the working version of that old program above. I didn't like relying on default initial values for I and J, so I added line 5.
Stored_Division.bas =================== 0 REM Original author: Steven A. O'Hara, Fall 1972 5 I=0\J=0 10 PRINT "TYPE NUMER,DENOM PLACES";\INPUT N,D,P 15 Q=INT(P/6)+1\DIM R(Q) 20 N=N*10\K=INT(N/D)\I=I-1+6*(I=0) 30 J=J+(I=5)\R(J)=R(J)+K*10^I\N=N-K*D 40 IF N*(J<Q) THEN 20 50 FOR I=1 TO Q-1\PRINT R(I);\NEXT I Parsed Basic Stored_Division.bas in 5 ms. Parse steps = 1,483. Tokens = 350. 8 lines, about 1,600 lines per second Created XML file Stored_Division_bas.xml, tokens = 350. TYPE NUMER,DENOM PLACES?1041,11773,50 88422 662023 273592 117557 122228 828675 783572 581330 |