Basic Programmar

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 Directory


Basic_Expression.java

public 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.java

public 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.java

public 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.java

public 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.java

public 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: Expressions


Expressions/Basic_AdditiveExpression.java

public 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.java

public 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.java

public 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.java

public class Basic_NegativeExpression extends PrimaryOperator
{
	public @S(10) Basic_Punctuation operator = new Basic_Punctuation("-");
	public @S(20) Basic_Expression expr;
}

Expressions/Basic_ParenthesizedExpression.java

public class Basic_ParenthesizedExpression extends PrimaryOperator
{
	public @S(10) PunctuationLeftParen leftParen;
	public @S(20) Basic_Expression expression;
	public @S(30) PunctuationRightParen rightParen;
}

Expressions/Basic_RelationalExpression.java

public 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.java

public 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.java

public class Basic_VariableExpression extends PrimaryOperator
{
	public @S(10) Basic_Variable variable;
}

Directory: Functions


Functions/Basic_AbsFunction.java

public 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.java

public 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.java

public 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.java

public 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.java

public 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.java

public 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: Statements


Statements/Basic_AssignmentStatement.java

public 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.java

public 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.java

public 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.java

public class Basic_EndStatement extends TokenSequence
{
	public @S(10) Basic_Keyword END = new Basic_Keyword("END");
}

Statements/Basic_ForStatement.java

public 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.java

public class Basic_GoSubStatement extends TokenSequence
{
	public @S(10) Basic_Keyword GOSUB = new Basic_Keyword("GOSUB");
	public @S(20) Basic_Number lbl;
}

Statements/Basic_GoToStatement.java

public class Basic_GoToStatement extends TokenSequence
{
	public @S(10) Basic_Keyword GOTO = new Basic_Keyword("GOTO");
	public @S(20) Basic_Number lbl;
}

Statements/Basic_IfStatement.java

public 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.java

public 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.java

public 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.java

public 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.java

public 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.java

public class Basic_RemStatement extends TokenSequence
{
	public @S(10) Basic_Keyword REM = new Basic_Keyword("REM");
	public @S(20) Basic_Comment comment;
}

Statements/Basic_ReturnStatement.java

public 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