BNF Grammar: Difference between revisions

45,942 bytes added ,  11 years ago
m
→‎Pascal: move to pacsal page
No edit summary
m (→‎Pascal: move to pacsal page)
 
(90 intermediate revisions by 25 users not shown)
Line 1:
{{DeprecatedTask}}
{{task|BNF GRAMMAR}}
In computer science, Backus–Naur Form (BNF) is a metasyntax used to express context-free grammars: that is, a formal way to describe formal languages. John Backus and Peter Naur developed a context free grammar to define the syntax of a programming language by using two sets of rules: i.e., lexical rules and syntactic rules.
 
Line 6:
There are many extensions and variants of BNF, including Extended and Augmented Backus–Naur Forms (EBNF and ABNF).
 
'''This is a deprecated task. Please move these grammars to the language's category page, or somewhere else.'''
The task here is establish a BNF grammar for as many languages as possible to facilitate language categorization and translation.
 
=={{header|4D}}==
==[[:Category:BASIC|BASIC]]==
=={{header|ALGOL 60}}==
<div style="height:30ex;overflow:scroll"><pre>
<pre>
! ----------------------------------------------------------------------------
! ALGOLBASIC '64 60
!
! Beginner's All-purpose Symbolic Instruction Code
! (ALGO)rithmic (L)anguage
!
! ALGOL "It is, bypractically far,impossible theto mostteach influentialgood programming language developedstyle to students
! that have had prior exposure to BASIC; as potential programmers they are
! date. Although is did not achieve mass use, a large number of syntactic
! mentally mutilated beyond hope of regeneration."
! and semantic principles and concepts were developed and incorporated into
!
! the language. As a result, ALGOL is considered the main reference language
! - Edsger W. Dijkstra
! in computer science.
!
! BASIC is one of the oldest programming language and one of the most popular.
! It was developed in 1964 by John G. Kemeny and Thomas E. Kurtz to teach
! students the basics of programming concepts. At the advent of the microcomputer,
! BASIC was implemented on numerous platforms such as the Commodore, Atari,
! Apple II, Altair, IBM PC computers. Over time, BASIC evolved into GW-BASIC,
! QBasic, Visual Basic, and recently Visual Basic .NET.
!
! In practically all programming languages, the reserved word/symbol that denotes
! a comment is treated as a form of whitespace - having no effect in the manner in
! which the program runs. Once such type of comment is used to indicate the remainder
! of the line is to be ignored. These can be added to the end of any line without
! changing the meaning of the program. In C++, it is the '//' symbol;
! in BASIC '64 it is 'REM'.
!
! However, in the BASIC programming language, the line comment is treated like a
! statement. For instance, if 'REM' was a normal line comment:
!
! 10 PRINT "Hello World" REM Common first program
!
! would be a valid statement. However, in BASIC, this is illegal. In the example
! above, the comment must be added as an additional statement.
!
! 10 PRINT "Hello World" : REM Common first program
!
! As a result, the Line Comment terminal that is used in the GOLD Parser cannot be
! used here. In the grammar below, a 'Remark' terminal was created that accepts all
! series of printable characters starting with the characters "REM ". In some
! implementations of BASIC, any string starting with "REM" is a comment statement.
! Examples include "REMARK", "REMARKABLE" and "REMODEL". This grammar requires the space.
!
! This grammar does not include the editor statements such as NEW, SAVE, LOAD, etc...
!
! Note: This is an ad hoc version of the language. If there are any flaws, please
! e-mail GOLDParser@DevinCook.com and I will update the grammar. Most likely I have
! included features not available in BASIC '64.
! -----------------------------------------------------------------------
 
 
"Name" = 'BASIC (Beginners All-purpose Symbolic Instruction Code)'
"Author" = 'John G. Kemeny and Thomas E. Kurtz'
"Version" = '1964 - Original - before Microsoft enhanced the language for the IBM PC.'
"About" = 'BASIC is one of most common and popular teaching languages ever created. '
 
"Case Sensitive" = False
"Start Symbol" = <Lines>
 
{String Chars} = {Printable} - ["]
{WS} = {Whitespace} - {CR} - {LF}
 
NewLine = {CR}{LF}|{CR}
Whitespace = {WS}+
 
Remark = REM{Space}{Printable}*
ID = {Letter}[$%]?
String = '"'{String Chars}*'"'
Integer = {digit}+
Real = {digit}+.{digit}+
 
<Lines> ::= Integer <Statements> NewLine <Lines>
| Integer <Statements> NewLine
 
<Statements> ::= <Statement> ':' <Statements>
| <Statement>
 
<Statement> ::= CLOSE '#' Integer
| DATA <Constant List>
| DIM ID '(' <Integer List> ')'
| END
| FOR ID '=' <Expression> TO <Expression>
| FOR ID '=' <Expression> TO <Expression> STEP Integer
| GOTO <Expression>
| GOSUB <Expression>
| IF <Expression> THEN <Statement>
| INPUT <ID List>
| INPUT '#' Integer ',' <ID List>
| LET Id '=' <Expression>
| NEXT <ID List>
| OPEN <Value> FOR <Access> AS '#' Integer
| POKE <Value List>
| PRINT <Print list>
| PRINT '#' Integer ',' <Print List>
| READ <ID List>
| RETURN
| RESTORE
| RUN
| STOP
| SYS <Value>
| WAIT <Value List>
| Remark
 
<Access> ::= INPUT
| OUPUT
<ID List> ::= ID ',' <ID List>
| ID
 
<Value List> ::= <Value> ',' <Value List>
| <Value>
 
<Constant List> ::= <Constant> ',' <Constant List>
| <Constant>
 
<Integer List> ::= Integer ',' <Integer List>
| Integer
<Expression List> ::= <Expression> ',' <Expression List>
| <Expression>
 
<Print List> ::= <Expression> ';' <Print List>
| <Expression>
|
 
<Expression> ::= <And Exp> OR <Expression>
| <And Exp>
 
<And Exp> ::= <Not Exp> AND <And Exp>
| <Not Exp>
<Not Exp> ::= NOT <Compare Exp>
| <Compare Exp>
 
<Compare Exp> ::= <Add Exp> '=' <Compare Exp>
| <Add Exp> '<>' <Compare Exp>
| <Add Exp> '><' <Compare Exp>
| <Add Exp> '>' <Compare Exp>
| <Add Exp> '>=' <Compare Exp>
| <Add Exp> '<' <Compare Exp>
| <Add Exp> '<=' <Compare Exp>
| <Add Exp>
 
<Add Exp> ::= <Mult Exp> '+' <Add Exp>
| <Mult Exp> '-' <Add Exp>
| <Mult Exp>
 
<Mult Exp> ::= <Negate Exp> '*' <Mult Exp>
| <Negate Exp> '/' <Mult Exp>
| <Negate Exp>
 
<Negate Exp> ::= '-' <Power Exp>
| <Power Exp>
 
<Power Exp> ::= <Power Exp> '^' <Value>
| <Value>
 
<Value> ::= '(' <Expression> ')'
| ID
| ID '(' <Expression List> ')'
| <Constant>
 
<Constant> ::= Integer
| String
| Real
</pre></div>
==[[:Category:BASIC Commodore PET|BASIC Commodore PET]]==
<div style="height:30ex;overflow:scroll"><pre>
! -----------------------------------------------------------------------
! Commodore PET BASIC
!
! Beginner's All-purpose Symbolic Instruction Code
!
! "It is practically impossible to teach good programming style to students
! that have had prior exposure to BASIC; as potential programmers they are
! mentally mutilated beyond hope of regeneration."
!
! - Edsger W. Dijkstra
!
!
! BASIC is one of the oldest programming language and one of the most popular.
! It was developed in 1964 by John G. Kemeny and Thomas E. Kurtz to teach
! students the basics of programming concepts. At the advent of the microcomputer,
! BASIC was implemented on numerous platforms such as the Commodore, Atari,
! Apple II, Altair, IBM PC computers. Over time, BASIC evolved into GW-BASIC,
! QBasic, Visual Basic, and recently Visual Basic .NET.
!
! In practically all programming languages, the reserved word/symbol that denotes
! a comment is treated as a form of whitespace - having no effect in the manner in
! which the program runs. Once such type of comment is used to indicate the remainder
! of the line is to be ignored. These can be added to the end of any line without
! changing the meaning of the program. In C++, it is the '//' symbol.
!
! However, in the BASIC programming language, the line comment is treated like a
! statement. For instance, if 'REM' was a normal line comment:
!
! 10 PRINT "Hello World" REM Common first program
!
! would be a valid statement. However, in BASIC, this is illegal. In the example
! above, the comment must be added as an additional statement.
!
! 10 PRINT "Hello World" : REM Common first program
!
! As a result, the Line Comment terminal that is used in the GOLD Parser cannot be
! used here. In the grammar below, a 'Remark' terminal was created that accepts all
! series of printable characters starting with the characters "REM ". In some
! implementations of BASIC, any string starting with "REM" is a comment statement.
! Examples include "REMARK", "REMARKABLE" and "REMODEL". This grammar requires the space.
!
! -----------------------------------------------------------------------
 
 
"Name" = 'Commodore PET BASIC'
"Author" = 'Commodore Business Machines'
"Version" = '2.0'
"About" = 'This is the version of BASIC that was used on the Commodore 64.'
 
"Case Sensitive" = False
"Start Symbol" = <Lines>
 
{String Chars} = {Printable} - ["]
{WS} = {Whitespace} - {CR} - {LF}
 
NewLine = {CR}{LF}|{CR}
Whitespace = {WS}+
 
Remark = REM{Space}{Printable}*
ID = {Letter}{Alphanumeric}?[$%]? !IDs are can only have a maximum of 2 characters
FunctionID = FN {Letter}{Letter}?
 
String = '"'{String Chars}*'"'
Integer = {Digit}+
Real = {Digit}+'.'{Digit}+
 
<Lines> ::= <Lines> <Line>
| <Line>
 
<Line> ::= Integer <Statements> NewLine
<Statements> ::= <Statements> ':' <Statement>
| <Statement>
 
<Statement> ::= CLOSE Integer
| CLR
| CMD <Expression>
| CONT !Continue
| DATA <Constant List>
| DEF FunctionID '(' <ID List> ')' '=' <Expression> !The ID must start with FN
| DIM ID '(' <Expression List> ')'
| END
| FOR ID '=' <Expression> TO <Expression> <Step Opt>
| GET ID
| GET '#' Integer ',' ID
| GOSUB <Expression>
| GOTO <Expression>
| IF <Expression> THEN <Then Clause>
| INPUT <ID List>
| INPUT '#' Integer ',' <ID List>
| LET ID '=' <Expression>
| LIST <Line Range>
| LOAD <Value List>
| ID '=' <Expression>
| NEW
| NEXT <ID List>
| ON ID GOTO <Expression List>
| OPEN <Expression List>
| POKE <Expression> ',' <Expression>
| PRINT <Print list>
| PRINT '#' Integer ',' <Print List>
| READ <ID List>
| RETURN
| RESTORE
| RUN
| RUN <Expression>
| STOP
| SYS <Expression>
| WAIT <Expression List>
| VERIFY <Expression List>
| Remark
 
<Step Opt> ::= STEP <Expression>
|
<ID List> ::= ID ',' <ID List>
| ID
 
<Value List> ::= <Value> ',' <Value List>
| <Value>
 
<Constant List> ::= <Constant> ',' <Constant List>
| <Constant>
<Expression List> ::= <Expression> ',' <Expression List>
| <Expression>
 
<Print List> ::= <Expression> ';' <Print List>
| <Expression>
|
 
<Line Range> ::= Integer
| Integer '-'
| Integer '-' Integer
 
<Then Clause> ::= Integer
| <Statement>
 
! ----------------------------------------------- Expressions
 
<Expression> ::= <And Exp> OR <Expression>
| <And Exp>
 
<And Exp> ::= <Not Exp> AND <And Exp>
| <Not Exp>
<Not Exp> ::= NOT <Compare Exp>
| <Compare Exp>
 
<Compare Exp> ::= <Add Exp> '=' <Compare Exp>
| <Add Exp> '<>' <Compare Exp>
| <Add Exp> '>' <Compare Exp>
| <Add Exp> '>=' <Compare Exp>
| <Add Exp> '<' <Compare Exp>
| <Add Exp> '<=' <Compare Exp>
| <Add Exp>
 
<Add Exp> ::= <Mult Exp> '+' <Add Exp>
| <Mult Exp> '-' <Add Exp>
| <Mult Exp>
 
<Mult Exp> ::= <Negate Exp> '*' <Mult Exp>
| <Negate Exp> '/' <Mult Exp>
| <Negate Exp>
 
<Negate Exp> ::= '-' <Power Exp>
| <Power Exp>
 
<Power Exp> ::= <Power Exp> '^' <Sub Exp> !On the Commodore, the symbol was an up-arrow
| <Sub Exp>
 
<Sub Exp> ::= '(' <Expression> ')'
| <Value>
 
<Value> ::= ID
| ABS '(' <Expression> ')'
| ASC '(' <Expression> ')'
| ATN '(' <Expression> ')'
| 'CHR$' '(' <Expression> ')'
| COS '(' <Expression> ')'
| EXP '(' <Expression> ')'
| FunctionID '(' <Expression List> ')'
| FRE '(' <Value> ')' !The <Value> is irrelevant
| INT '(' <Expression> ')'
| 'LEFT$' '(' <Expression> ',' <Expression> ')'
| LEN '(' <Expression> ')'
| PEEK '(' <Expression> ')'
| POS '(' <Value> ')' !The <Value> is irrelevant
| 'RIGHT$' '(' <Expression> ',' <Expression> ')'
| RND '(' <Expression> ')'
| SGN '(' <Expression> ')'
| SPC '(' <Expression> ')'
| SQR '(' <Expression> ')'
| TAB '(' <Expression> ')'
| TAN '(' <Expression> ')'
| VAL '(' <Expression> ')'
| <Constant>
 
<Constant> ::= Integer
| String
| Real
 
</pre></div>
 
==[[:Category:Brainf***|Brainf***]]==
 
Code ::= Command Code | <NONE>
Command ::= "+" | "-" | "<" | ">" | "," | "." | "[" Code "]" | <ANY>
 
==[[:Category:PARI/GP|PARI/GP]]==
[http://pari.math.u-bordeaux.fr/cgi-bin/viewcvs.cgi/trunk/src/language/parse.y?view=markup&revision=12950&root=pari parse.y] contains a grammar for GP. The grammar for PARI is that of [http://c.comsci.us/syntax/ C].
 
==[[:Category:PowerShell|PowerShell]]==
An annotated version of the PowerShell grammar can be found in Bruce Payette's book ''Windows PowerShell in Action''. The appendix containing the grammar is available in [http://www.manning.com/payette/AppCexcerpt.pdf PDF form] on the publisher's site.
 
This grammar does not accurately represent the PowerShell language, though, as for example the <code>for</code> loop mandates semicolons in the grammar but in practice does not require them when arguments are omitted. The infinite loop may be represented by
<lang powershell>for () {}</lang>
but the grammar would require
<lang powershell>for (;;) {}</lang>
 
==[[:Category:VBScript|VBScript]]==
<div style="height:30ex;overflow:scroll"><pre>
!===============================
! VB Script grammar.
!
! To create the grammar I was using Microsoft's VB Script documentation
! available from http://msdn.microsoft.com/scripting,
! VB Script parser from ArrowHead project http://www.tripi.com/arrowhead/,
! and Visual Basic .Net grammar file written by Devin Cook.
!
! This grammar cannot cover all aspects of VBScript and may have some errors.
! Feel free to contact me if you find any flaws in the grammar.
!
! Vladimir Morozov vmoroz@hotmail.com
!
! Special thanks to Nathan Baulch for the grammar updates.
!
! USE GOLD PARSER BUILDER VERSION 2.1 AND LATER TO COMPILE THIS GRAMMAR.
!===============================
 
"Name" = 'VB Script'
"Author" = 'John G. Kemeny and Thomas E. Kurtz'
"Version" = '5.0'
"About" = 'VB Script grammar.'
"Case Sensitive" = False
"Start Symbol" = <Program>
 
!===============================
! Character sets
!===============================
 
{String Char} = {All Valid} - ["]
{Date Char} = {Printable} - [#]
{ID Name Char} = {Printable} - ['['']']
{Hex Digit} = {Digit} + [abcdef]
{Oct Digit} = [01234567]
{WS} = {Whitespace} - {CR} - {LF}
{ID Tail} = {Alphanumeric} + [_]
 
!===============================
! Terminals
!===============================
 
NewLine = {CR} {LF}
| {CR}
| {LF}
| ':'
 
! Special white space definition. Whitespace is either space or tab, which
! can be followed by continuation symbol '_' followed by new line character
Whitespace = {WS}+
| '_' {WS}* {CR}? {LF}?
 
! Special comment definition
Comment Line = ''
| 'Rem'
 
! Literals
StringLiteral = '"' ( {String Char} | '""' )* '"'
IntLiteral = {Digit}+
HexLiteral = '&H' {Hex Digit}+ '&'?
OctLiteral = '&' {Oct Digit}+ '&'?
FloatLiteral = {Digit}* '.' {Digit}+ ( 'E' [+-]? {Digit}+ )?
| {Digit}+ 'E' [+-]? {Digit}+
DateLiteral = '#' {Date Char}+ '#'
 
! Identifier is either starts with letter and followed by letter,
! number or underscore, or it can be escaped sequence of any printable
! characters ([] and [_$% :-) @] are valid identifiers)
ID = {Letter} {ID Tail}*
| '[' {ID Name Char}* ']'
 
! White space is not allowed to be before dot, but allowed to be after it.
IDDot = {Letter} {ID Tail}* '.'
| '[' {ID Name Char}* ']' '.'
| 'And.'
| 'ByRef.'
| 'ByVal.'
| 'Call.'
| 'Case.'
| 'Class.'
| 'Const.'
| 'Default.'
| 'Dim.'
| 'Do.'
| 'Each.'
| 'Else.'
| 'ElseIf.'
| 'Empty.'
| 'End.'
| 'Eqv.'
| 'Erase.'
| 'Error.'
| 'Exit.'
| 'Explicit.'
| 'False.'
| 'For.'
| 'Function.'
| 'Get.'
| 'GoTo.'
| 'If.'
| 'Imp.'
| 'In.'
| 'Is.'
| 'Let.'
| 'Loop.'
| 'Mod.'
| 'New.'
| 'Next.'
| 'Not.'
| 'Nothing.'
| 'Null.'
| 'On.'
| 'Option.'
| 'Or.'
| 'Preserve.'
| 'Private.'
| 'Property.'
| 'Public.'
| 'Redim.'
| 'Rem.'
| 'Resume.'
| 'Select.'
| 'Set.'
| 'Step.'
| 'Sub.'
| 'Then.'
| 'To.'
| 'True.'
| 'Until.'
| 'WEnd.'
| 'While.'
| 'With.'
| 'Xor.'
 
! The following identifiers should only be used in With statement.
! This rule must be checked by contextual analyzer.
DotID = '.' {Letter} {ID Tail}*
| '.' '[' {ID Name Char}* ']'
| '.And'
| '.ByRef'
| '.ByVal'
| '.Call'
| '.Case'
| '.Class'
| '.Const'
| '.Default'
| '.Dim'
| '.Do'
| '.Each'
| '.Else'
| '.ElseIf'
| '.Empty'
| '.End'
| '.Eqv'
| '.Erase'
| '.Error'
| '.Exit'
| '.Explicit'
| '.False'
| '.For'
| '.Function'
| '.Get'
| '.GoTo'
| '.If'
| '.Imp'
| '.In'
| '.Is'
| '.Let'
| '.Loop'
| '.Mod'
| '.New'
| '.Next'
| '.Not'
| '.Nothing'
| '.Null'
| '.On'
| '.Option'
| '.Or'
| '.Preserve'
| '.Private'
| '.Property'
| '.Public'
| '.Redim'
| '.Rem'
| '.Resume'
| '.Select'
| '.Set'
| '.Step'
| '.Sub'
| '.Then'
| '.To'
| '.True'
| '.Until'
| '.WEnd'
| '.While'
| '.With'
| '.Xor'
 
DotIDDot = '.' {Letter}{ID Tail}* '.'
| '.' '[' {ID Name Char}* ']' '.'
| '.And.'
| '.ByRef.'
| '.ByVal.'
| '.Call.'
| '.Case.'
| '.Class.'
| '.Const.'
| '.Default.'
| '.Dim.'
| '.Do.'
| '.Each.'
| '.Else.'
| '.ElseIf.'
| '.Empty.'
| '.End.'
| '.Eqv.'
| '.Erase.'
| '.Error.'
| '.Exit.'
| '.Explicit.'
| '.False.'
| '.For.'
| '.Function.'
| '.Get.'
| '.GoTo.'
| '.If.'
| '.Imp.'
| '.In.'
| '.Is.'
| '.Let.'
| '.Loop.'
| '.Mod.'
| '.New.'
| '.Next.'
| '.Not.'
| '.Nothing.'
| '.Null.'
| '.On.'
| '.Option.'
| '.Or.'
| '.Preserve.'
| '.Private.'
| '.Property.'
| '.Public.'
| '.Redim.'
| '.Rem.'
| '.Resume.'
| '.Select.'
| '.Set.'
| '.Step.'
| '.Sub.'
| '.Then.'
| '.To.'
| '.True.'
| '.Until.'
| '.WEnd.'
| '.While.'
| '.With.'
| '.Xor.'
 
!===============================
! Rules
!===============================
 
<NL> ::= NewLine <NL>
| NewLine
 
<Program> ::= <NLOpt> <GlobalStmtList>
 
!===============================
! Rules : Declarations
!===============================
 
<ClassDecl> ::= 'Class' <ExtendedID> <NL> <MemberDeclList> 'End' 'Class' <NL>
 
<MemberDeclList> ::= <MemberDecl> <MemberDeclList>
|
 
<MemberDecl> ::= <FieldDecl>
| <VarDecl>
| <ConstDecl>
| <SubDecl>
| <FunctionDecl>
| <PropertyDecl>
 
<FieldDecl> ::= 'Private' <FieldName> <OtherVarsOpt> <NL>
| 'Public' <FieldName> <OtherVarsOpt> <NL>
 
<FieldName> ::= <FieldID> '(' <ArrayRankList> ')'
| <FieldID>
 
<FieldID> ::= ID
| 'Default'
| 'Erase'
| 'Error'
| 'Explicit'
| 'Step'
 
<VarDecl> ::= 'Dim' <VarName> <OtherVarsOpt> <NL>
 
<VarName> ::= <ExtendedID> '(' <ArrayRankList> ')'
| <ExtendedID>
 
<OtherVarsOpt> ::= ',' <VarName> <OtherVarsOpt>
|
 
<ArrayRankList> ::= <IntLiteral> ',' <ArrayRankList>
| <IntLiteral>
|
 
<ConstDecl> ::= <AccessModifierOpt> 'Const' <ConstList> <NL>
 
<ConstList> ::= <ExtendedID> '=' <ConstExprDef> ',' <ConstList>
| <ExtendedID> '=' <ConstExprDef>
 
<ConstExprDef> ::= '(' <ConstExprDef> ')'
| '-' <ConstExprDef>
| '+' <ConstExprDef>
| <ConstExpr>
 
<SubDecl> ::= <MethodAccessOpt> 'Sub' <ExtendedID> <MethodArgList> <NL> <MethodStmtList> 'End' 'Sub' <NL>
| <MethodAccessOpt> 'Sub' <ExtendedID> <MethodArgList> <InlineStmt> 'End' 'Sub' <NL>
 
<FunctionDecl> ::= <MethodAccessOpt> 'Function' <ExtendedID> <MethodArgList> <NL> <MethodStmtList> 'End' 'Function' <NL>
| <MethodAccessOpt> 'Function' <ExtendedID> <MethodArgList> <InlineStmt> 'End' 'Function' <NL>
 
<MethodAccessOpt> ::= 'Public' 'Default'
| <AccessModifierOpt>
 
<AccessModifierOpt> ::= 'Public'
| 'Private'
|
 
<MethodArgList> ::= '(' <ArgList> ')'
| '(' ')'
|
 
<ArgList> ::= <Arg> ',' <ArgList>
| <Arg>
 
<Arg> ::= <ArgModifierOpt> <ExtendedID> '(' ')'
| <ArgModifierOpt> <ExtendedID>
 
<ArgModifierOpt> ::= 'ByVal'
| 'ByRef'
|
 
<PropertyDecl> ::= <MethodAccessOpt> 'Property' <PropertyAccessType> <ExtendedID> <MethodArgList> <NL> <MethodStmtList> 'End' 'Property' <NL>
 
<PropertyAccessType> ::= 'Get'
| 'Let'
| 'Set'
 
!===============================
! Rules : Statements
!===============================
 
<GlobalStmt> ::= <OptionExplicit>
| <ClassDecl>
| <FieldDecl>
| <ConstDecl>
| <SubDecl>
| <FunctionDecl>
| <BlockStmt>
 
<MethodStmt> ::= <ConstDecl>
| <BlockStmt>
 
<BlockStmt> ::= <VarDecl>
| <RedimStmt>
| <IfStmt>
| <WithStmt>
| <SelectStmt>
| <LoopStmt>
| <ForStmt>
| <InlineStmt> <NL>
 
<InlineStmt> ::= <AssignStmt>
| <CallStmt>
| <SubCallStmt>
| <ErrorStmt>
| <ExitStmt>
| 'Erase' <ExtendedID>
 
<GlobalStmtList> ::= <GlobalStmt> <GlobalStmtList>
|
 
<MethodStmtList> ::= <MethodStmt> <MethodStmtList>
|
<BlockStmtList> ::= <BlockStmt> <BlockStmtList>
|
<OptionExplicit> ::= 'Option' 'Explicit' <NL>
 
<ErrorStmt> ::= 'On' 'Error' 'Resume' 'Next'
| 'On' 'Error' 'GoTo' IntLiteral ! must be 0
 
<ExitStmt> ::= 'Exit' 'Do'
| 'Exit' 'For'
| 'Exit' 'Function'
| 'Exit' 'Property'
| 'Exit' 'Sub'
 
<AssignStmt> ::= <LeftExpr> '=' <Expr>
| 'Set' <LeftExpr> '=' <Expr>
| 'Set' <LeftExpr> '=' 'New' <LeftExpr>
 
! Hack: VB Script allows to have construct a = b = c, which means a = (b = c)
! In this grammar we do not allow it in order to prevent complications with
! interpretation of a(1) = 2, which may be considered as array element assignment
! or a subroutine call: a ((1) = 2).
! Note: VBScript allows to have missed parameters: a ,,2,3,
! VM: If somebody knows a better way to do it, please let me know
<SubCallStmt> ::= <QualifiedID> <SubSafeExprOpt> <CommaExprList>
| <QualifiedID> <SubSafeExprOpt>
| <QualifiedID> '(' <Expr> ')' <CommaExprList>
| <QualifiedID> '(' <Expr> ')'
| <QualifiedID> '(' ')'
| <QualifiedID> <IndexOrParamsList> '.' <LeftExprTail> <SubSafeExprOpt> <CommaExprList>
| <QualifiedID> <IndexOrParamsListDot> <LeftExprTail> <SubSafeExprOpt> <CommaExprList>
| <QualifiedID> <IndexOrParamsList> '.' <LeftExprTail> <SubSafeExprOpt>
| <QualifiedID> <IndexOrParamsListDot> <LeftExprTail> <SubSafeExprOpt>
 
! This very simplified case - the problem is that we cannot use parenthesis in aaa(bbb).ccc (ddd)
<SubSafeExprOpt> ::= <SubSafeExpr>
|
 
<CallStmt> ::= 'Call' <LeftExpr>
 
<LeftExpr> ::= <QualifiedID> <IndexOrParamsList> '.' <LeftExprTail>
| <QualifiedID> <IndexOrParamsListDot> <LeftExprTail>
| <QualifiedID> <IndexOrParamsList>
| <QualifiedID>
| <SafeKeywordID>
 
<LeftExprTail> ::= <QualifiedIDTail> <IndexOrParamsList> '.' <LeftExprTail>
| <QualifiedIDTail> <IndexOrParamsListDot> <LeftExprTail>
| <QualifiedIDTail> <IndexOrParamsList>
| <QualifiedIDTail>
 
! VB Script does not allow to have space between Identifier and dot:
! a . b - Error ; a. b or a.b - OK
<QualifiedID> ::= IDDot <QualifiedIDTail>
| DotIDDot <QualifiedIDTail>
| ID
| DotID
 
<QualifiedIDTail> ::= IDDot <QualifiedIDTail>
| ID
| <KeywordID>
 
<KeywordID> ::= <SafeKeywordID>
| 'And'
| 'ByRef'
| 'ByVal'
| 'Call'
| 'Case'
| 'Class'
| 'Const'
| 'Dim'
| 'Do'
| 'Each'
| 'Else'
| 'ElseIf'
| 'Empty'
| 'End'
| 'Eqv'
| 'Exit'
| 'False'
| 'For'
| 'Function'
| 'Get'
| 'GoTo'
| 'If'
| 'Imp'
| 'In'
| 'Is'
| 'Let'
| 'Loop'
| 'Mod'
| 'New'
| 'Next'
| 'Not'
| 'Nothing'
| 'Null'
| 'On'
| 'Option'
| 'Or'
| 'Preserve'
| 'Private'
| 'Public'
| 'Redim'
| 'Resume'
| 'Select'
| 'Set'
| 'Sub'
| 'Then'
| 'To'
| 'True'
| 'Until'
| 'WEnd'
| 'While'
| 'With'
| 'Xor'
 
<SafeKeywordID> ::= 'Default'
| 'Erase'
| 'Error'
| 'Explicit'
| 'Property'
| 'Step'
 
<ExtendedID> ::= <SafeKeywordID>
| ID
 
<IndexOrParamsList> ::= <IndexOrParams> <IndexOrParamsList>
| <IndexOrParams>
 
<IndexOrParams> ::= '(' <Expr> <CommaExprList> ')'
| '(' <CommaExprList> ')'
| '(' <Expr> ')'
| '(' ')'
 
<IndexOrParamsListDot> ::= <IndexOrParams> <IndexOrParamsListDot>
| <IndexOrParamsDot>
 
<IndexOrParamsDot> ::= '(' <Expr> <CommaExprList> ').'
| '(' <CommaExprList> ').'
| '(' <Expr> ').'
| '(' ').'
 
<CommaExprList> ::= ',' <Expr> <CommaExprList>
| ',' <CommaExprList>
| ',' <Expr>
| ','
 
!========= Redim Statement
 
<RedimStmt> ::= 'Redim' <RedimDeclList> <NL>
| 'Redim' 'Preserve' <RedimDeclList> <NL>
 
<RedimDeclList> ::= <RedimDecl> ',' <RedimDeclList>
| <RedimDecl>
 
<RedimDecl> ::= <ExtendedID> '(' <ExprList> ')'
 
!========= If Statement
 
<IfStmt> ::= 'If' <Expr> 'Then' <NL> <BlockStmtList> <ElseStmtList> 'End' 'If' <NL>
| 'If' <Expr> 'Then' <InlineStmt> <ElseOpt> <EndIfOpt> <NL>
 
<ElseStmtList> ::= 'ElseIf' <Expr> 'Then' <NL> <BlockStmtList> <ElseStmtList>
| 'ElseIf' <Expr> 'Then' <InlineStmt> <NL> <ElseStmtList>
| 'Else' <InlineStmt> <NL>
| 'Else' <NL> <BlockStmtList>
|
 
<ElseOpt> ::= 'Else' <InlineStmt>
|
 
<EndIfOpt> ::= 'End' 'If'
|
 
!========= With Statement
 
<WithStmt> ::= 'With' <Expr> <NL> <BlockStmtList> 'End' 'With' <NL>
 
!========= Loop Statement
 
<LoopStmt> ::= 'Do' <LoopType> <Expr> <NL> <BlockStmtList> 'Loop' <NL>
| 'Do' <NL> <BlockStmtList> 'Loop' <LoopType> <Expr> <NL>
| 'Do' <NL> <BlockStmtList> 'Loop' <NL>
| 'While' <Expr> <NL> <BlockStmtList> 'WEnd' <NL>
 
<LoopType> ::= 'While'
| 'Until'
 
!========= For Statement
 
<ForStmt> ::= 'For' <ExtendedID> '=' <Expr> 'To' <Expr> <StepOpt> <NL> <BlockStmtList> 'Next' <NL>
| 'For' 'Each' <ExtendedID> 'In' <Expr> <NL> <BlockStmtList> 'Next' <NL>
 
<StepOpt> ::= 'Step' <Expr>
|
 
!========= Select Statement
 
<SelectStmt> ::= 'Select' 'Case' <Expr> <NL> <CaseStmtList> 'End' 'Select' <NL>
 
<CaseStmtList> ::= 'Case' <ExprList> <NLOpt> <BlockStmtList> <CaseStmtList>
| 'Case' 'Else' <NLOpt> <BlockStmtList>
|
 
<NLOpt> ::= <NL>
|
 
<ExprList> ::= <Expr> ',' <ExprList>
| <Expr>
 
!===============================
! Rules : Expressions
!===============================
 
<SubSafeExpr> ::= <SubSafeImpExpr>
 
<SubSafeImpExpr> ::= <SubSafeImpExpr> 'Imp' <EqvExpr>
| <SubSafeEqvExpr>
 
<SubSafeEqvExpr> ::= <SubSafeEqvExpr> 'Eqv' <XorExpr>
| <SubSafeXorExpr>
 
<SubSafeXorExpr> ::= <SubSafeXorExpr> 'Xor' <OrExpr>
| <SubSafeOrExpr>
 
<SubSafeOrExpr> ::= <SubSafeOrExpr> 'Or' <AndExpr>
| <SubSafeAndExpr>
 
<SubSafeAndExpr> ::= <SubSafeAndExpr> 'And' <NotExpr>
| <SubSafeNotExpr>
 
<SubSafeNotExpr> ::= 'Not' <NotExpr>
| <SubSafeCompareExpr>
 
<SubSafeCompareExpr> ::= <SubSafeCompareExpr> 'Is' <ConcatExpr>
| <SubSafeCompareExpr> 'Is' 'Not' <ConcatExpr>
| <SubSafeCompareExpr> '>=' <ConcatExpr>
| <SubSafeCompareExpr> '=>' <ConcatExpr>
| <SubSafeCompareExpr> '<=' <ConcatExpr>
| <SubSafeCompareExpr> '=<' <ConcatExpr>
| <SubSafeCompareExpr> '>' <ConcatExpr>
| <SubSafeCompareExpr> '<' <ConcatExpr>
| <SubSafeCompareExpr> '<>' <ConcatExpr>
| <SubSafeCompareExpr> '=' <ConcatExpr>
| <SubSafeConcatExpr>
 
<SubSafeConcatExpr> ::= <SubSafeConcatExpr> '&' <AddExpr>
| <SubSafeAddExpr>
 
<SubSafeAddExpr> ::= <SubSafeAddExpr> '+' <ModExpr>
| <SubSafeAddExpr> '-' <ModExpr>
| <SubSafeModExpr>
 
<SubSafeModExpr> ::= <SubSafeModExpr> 'Mod' <IntDivExpr>
| <SubSafeIntDivExpr>
 
<SubSafeIntDivExpr> ::= <SubSafeIntDivExpr> '\' <MultExpr>
| <SubSafeMultExpr>
 
<SubSafeMultExpr> ::= <SubSafeMultExpr> '*' <UnaryExpr>
| <SubSafeMultExpr> '/' <UnaryExpr>
| <SubSafeUnaryExpr>
 
<SubSafeUnaryExpr> ::= '-' <UnaryExpr>
| '+' <UnaryExpr>
| <SubSafeExpExpr>
 
<SubSafeExpExpr> ::= <SubSafeValue> '^' <ExpExpr>
| <SubSafeValue>
 
<SubSafeValue> ::= <ConstExpr>
| <LeftExpr>
! | '(' <Expr> ')'
 
<Expr> ::= <ImpExpr>
 
<ImpExpr> ::= <ImpExpr> 'Imp' <EqvExpr>
| <EqvExpr>
 
<EqvExpr> ::= <EqvExpr> 'Eqv' <XorExpr>
| <XorExpr>
 
<XorExpr> ::= <XorExpr> 'Xor' <OrExpr>
| <OrExpr>
 
<OrExpr> ::= <OrExpr> 'Or' <AndExpr>
| <AndExpr>
 
<AndExpr> ::= <AndExpr> 'And' <NotExpr>
| <NotExpr>
 
<NotExpr> ::= 'Not' <NotExpr>
| <CompareExpr>
 
<CompareExpr> ::= <CompareExpr> 'Is' <ConcatExpr>
| <CompareExpr> 'Is' 'Not' <ConcatExpr>
| <CompareExpr> '>=' <ConcatExpr>
| <CompareExpr> '=>' <ConcatExpr>
| <CompareExpr> '<=' <ConcatExpr>
| <CompareExpr> '=<' <ConcatExpr>
| <CompareExpr> '>' <ConcatExpr>
| <CompareExpr> '<' <ConcatExpr>
| <CompareExpr> '<>' <ConcatExpr>
| <CompareExpr> '=' <ConcatExpr>
| <ConcatExpr>
 
<ConcatExpr> ::= <ConcatExpr> '&' <AddExpr>
| <AddExpr>
 
<AddExpr> ::= <AddExpr> '+' <ModExpr>
| <AddExpr> '-' <ModExpr>
| <ModExpr>
 
<ModExpr> ::= <ModExpr> 'Mod' <IntDivExpr>
| <IntDivExpr>
 
<IntDivExpr> ::= <IntDivExpr> '\' <MultExpr>
| <MultExpr>
 
<MultExpr> ::= <MultExpr> '*' <UnaryExpr>
| <MultExpr> '/' <UnaryExpr>
| <UnaryExpr>
 
<UnaryExpr> ::= '-' <UnaryExpr>
| '+' <UnaryExpr>
| <ExpExpr>
 
<ExpExpr> ::= <Value> '^' <ExpExpr>
| <Value>
 
<Value> ::= <ConstExpr>
| <LeftExpr>
| '(' <Expr> ')'
 
<ConstExpr> ::= <BoolLiteral>
| <IntLiteral>
| FloatLiteral
| StringLiteral
| DateLiteral
| <Nothing>
 
<BoolLiteral> ::= 'True'
| 'False'
 
<IntLiteral> ::= IntLiteral
| HexLiteral
| OctLiteral
 
<Nothing> ::= 'Nothing'
| 'Null'
| 'Empty'
</pre></div>
 
==[[:Category:Visual Basic .NET|Visual Basic .NET]]==
The following link (Appedix B) has a simple BNF Syntax [http://laser.physics.sunysb.edu/~amol/papers/mollypaper.pdf VB Syntax]
<div style="height:30ex;overflow:scroll"><pre>
! -----------------------------------------------------------------------
! Visual Basic .NET
!
! Visual Basic .NET is the latest version in the long evoluation of the
! In the late 1950's, many in the study of computer science believed that a
! new universalBASIC programming language was needed. ThisThe newVisual languageBasic would.NET beprogramming language
! is far more "clean" and orthagonal than its predecessors. Although some
! used through the study of computer science and would eventually replace
! of the old constructs exist, the language is far easier to read and write.
! other popular languages such as FORTRAN.
!
! Major syntax changes include, but are not limited to:
! The ACM (Association for Computing Machinery) and GAMM (a European
! organization of mathematics and mechanics) created an international
! committee to define and document the new language. This committee
! included computer scientists from both North America and Europe.
!
! 1. The primative file access of VB6 was replaced by a class library. As
! The process of developing ALGOL included a number of challenges:
! a result, special statements such as
!
! Open "test" For Input As #1
!
! no longer exist.
!
! 2. Class module files were replaced by 'Class ... End Class' declarations
! First, the computers of the era varied greatly in the number of characters
! that could be represented. This made it difficult to define the exact
! lexics of the language. For instance, one mainframe could contain an
! ampersand character (&) while another may not.
!
! 3. Module files were replaced by 'Module ... End Module' declarations
! Another challenge involved an issue that nowadays seems trival - the
!
! representation of decimal points. In the 50 United States and Canada, real
! 4. Structured error handling was added with C++ style Try ... Catch
! numbers are represented using a period. For instance, the value 4 1/2 can
! statements. The old nonstructured approach is still, unfortunately,
! be written as "4.5". Europe, on the other hand, uses a comma. The same
! available.
! value is represented with "4,5". Both sides were steadfast that their
! format was superior. Although the "period" format would eventually
! dominate, this was a major issue at the time.
!
! To describe the syntax of the first version of ALGOL, Peter Naur modified
! Backus Normal Form to create Backus-Naur Form. This format is now used
! universially to describe the syntax of programming languages.
!
! Unfortnately, the designers of Visual Basic .NET did not remove the
! To spite these challenges, ALGOL created a number of language features
! datatype postfix characters on identifiers. In the original BASIC,
! that would be incorporated into its numerious successors. These include:
! variables types were determined by $ for strings and % for integers.
!
! QuickBasic expanded the postix notation to include other symbols
! * Block structure
! for long integers, singles, etc...
! * Free-form structure (elements are not required to be in a specific column)
!
! * Pass by Name (while powerful, it is not used in modern languages)
! Part of the ID terminal definition was commented out to prevent the
! * The For-Loop
! old format. You can allow the postfix characters if you like.
! * The 'Else' clause on if-statements (LISP's 'cond' predates this though)
!
! * Reserved words
! This grammar also does not contain the compiler directives.
!
!
! The grammar below was, for the most part, cut and pasted from "Revised
! Note: This is an ad hoc version of the language. If there are any flaws,
! Report on the Algorithmic Language: Algol 60" by Peter Naur. The numbered
! please visit www.DevinCook.com/GOLDParser
! sections refer directly to the chapters in the Report.
!
! Updates:
! 04/082005
! Devin Cook
! 1. Removed minus sign from the IntLiteral and RealLiteral
! definitions. These can cause some parse errors when expressions
! like "2-2" are read. In this case it would have been interpreted
! as "2" and "-2" rather than "2", "-" and "2".
! 2. Members of an enumeration can be defined with any expression.
! 3. Made some very minor comment changes - mainly for readability.
!
! 03/27/2005
! Adrian Moore [adrianrob@hotmail.com]
! 1. Add support for Implements in Class
! 2. Add support for AddressOf keyword
! 3. No longer fails if variable starts with _
!
! 02/24/2004
! Vladimir Morozov [vmoroz@hotmail.com] fixed a few flaws in the
! grammar. 1. The definition for strings did not allow the double
! double-quote override. 2. A real literal does not need to have a
! fraction if followed by an exponent. 3. Escaped identifiers can
! contain a null string and 4. Rem works the same as the '
!
! The grammar was modified to remove ambigities and define terminals using
! regular expressions.
!
! USE GOLD PARSER BUILDER VERSION 2.1 AND LATER TO COMPILE THIS GRAMMAR.
! ----------------------------------------------------------------------------
! Earlier versions cannot handle the complexity.
! -----------------------------------------------------------------------
 
"Name" = 'Visual Basic .NET'
"Author" = 'John G. Kemeny and Thomas E. Kurtz'
"Version" = '.NET'
"About" = 'Visual Basic .NET is the latest version in the long evoluation of the'
| 'BASIC programming language.'
 
"Case Sensitive" = False
"Name" = 'ALGOL 60'
"VersionStart Symbol" = '1960'<Program>
 
! ----------------------------------------------------------------- Sets
"Author" = 'J.W. Backus, F.L. Bauer, J.Green, C. Katz, J. McCarthy, P. Naur,'
| 'A.J. Perlis, H. Rutishauser, K. Samuelson, B. Vauquois,'
| 'J.H. Wegstein, A. van Wijngaarden, M. Woodger'
 
{String Chars} = {Printable} - ["]
"About" = 'ALGOL (ALGOrithmic Language) is the most influential'
{Date Chars} = {Printable} - [#]
| 'programming language to date. Although it did not achieve'
{ID Name Chars} = {Printable} - ['['']']
| 'mass use, it established multiple syntactic and semantic'
{Hex Digit} = {Digit} + [abcdef]
| 'features used in languages today.'
{Oct Digit} = [01234567]
 
{WS} = {Whitespace} - {CR} - {LF}
{Id Tail} = {Alphanumeric} + [_]
 
! ----------------------------------------------------------------- Terminals
"Start Symbol" = <program>
 
NewLine = {CR}{LF} | {CR} | ':'
Whitespace = {WS}+ | '_' {WS}* {CR} {LF}?
 
Comment Line = '' | Rem !Fixed by Vladimir Morozov
! ========================================================== Terminals
 
LABEL = {Letter}{ID Tail}*':'
 
!Fixed by Vladimir Morozov
{String Ch} = {Printable} - [`] - ['']
 
ID = [_]?{Letter}{ID Tail}* ! [%&@!#$]? !Archaic postfix chars
Identifier = {Letter}{Alphanumeric}*
| '[' {ID Name Chars}* ']'
QualifiedID = ({Letter}{ID Tail}* | '['{ID Name Chars}*']') ( '.'({Letter}{ID Tail}* | '['{ID Name Chars}*']') )+
 
String MemberID = '`' ( '`.' {String ChLetter}* '' | {StringID ChTail} )* ''
| '.[' {ID Name Chars}* ']'
!Fixed by Vladimir Morozov
StringLiteral = '"' ( {String Chars} | '""' )* '"'
 
IntegerLiteral = {Digit}+
RealLiteral = {Digit}+ '.' {Digit}+ (e {Digit}+)?
 
CharLiteral = '"' {String Chars}* '"C'
IntLiteral = {digit}+ [FRDSIL]?
 
RealLiteral = {digit}* '.' {digit}+ ( 'E' [+-]? {Digit}+ )? [FR]?
! =========================================================== Rules
| {digit}+ 'E' [+-]? {Digit}+ [FR]?
 
<unsigned integer>
::= IntegerLiteral
<unsigned number>
::= IntegerLiteral
| RealLiteral
 
DateLiteral = '#'{Date chars}'#'
 
HexLiteral = '&H'{Hex Digit}+ [SIL]?
! ====================================================================
OctLiteral = '&O'{Oct Digit}+ [SIL]?
! 2.2.2 Logical values.
! ====================================================================
 
! ----------------------------------------------------------------- Rules
<logical value> ::= true | false
 
<Program> ::= <NameSpace Item> <Program>
| <Imports> <Program>
| <Option Decl> <Program>
|
 
! -------------------------------------------------------------------
! (Shared attributes)
! -------------------------------------------------------------------
 
<NL> ::= NewLine <NL>
! ====================================================================
| NewLine
! 3. Expressions
! ====================================================================
 
<Modifiers> ::= <Modifier> <Modifiers>
<expression>
::= <Boolean expression> |
 
<Modifier> ::= Shadows
! ====================================================================
| Shared
! 3.1. Variables
| MustInherit
! ====================================================================
| NotInheritable
 
| Overridable
<subscript expression>
::= <arithmetic expression> | NotOverridable
| MustOverride
| Overrides
| Overloads
| Default
| ReadOnly
| WriteOnly
| <Access>
 
<Access Opt> ::= <Access>
<subscript list>
::= <subscript expression> |
| <subscript list> ',' <subscript expression>
 
<Access> ::= Public
| Private
| Friend
| Protected
 
<Var Member> ::= <Attributes> <Access> <Var Decl> <NL> !Variables
<variable>
| <Attributes> <Access Opt> Const <Var Decl> <NL> !Constants
::= Identifier
| Identifier<Attributes> '['<Access Opt> Static <subscriptVar listDecl> ']'<NL> ! subscripted value
<Implements> ::= Implements <ID List>
 
<ID List> ::= <Identifier> ',' <ID List>
! ====================================================================
| <Identifier>
! 3.2. Function designators
! ====================================================================
<Option Decl> ::= Option <IDs> <NL>
 
<IDs> ::= ID <IDs>
<actual parameter>
::=| StringID
| <expression>
<Type> ::= As <Attributes> <Identifier>
|
 
<Compare Op> ::= '=' | '<>' | '<' | '>' | '>=' | '<='
<parameter delimiter>
::= ','
| ')' Identifier ':' '('
 
! -------------------------------------------------------------------
! NameSpace
! -------------------------------------------------------------------
 
<NameSpace> ::= NameSpace ID <NL> <NameSpace Items> End NameSpace <NL>
<actual parameter list>
::= <actual parameter>
| <actual parameter list> <parameter delimiter> <actual parameter>
 
<NameSpace Items> ::= <NameSpace Item> <NameSpace Items>
|
 
<NameSpace Item> ::= <Class>
! ====================================================================
| <Declare>
! 3.3. Arithmetic expressions
| <Delegate>
! ====================================================================
| <Enumeration>
| <Interface>
| <Structure>
| <Module>
| <Namespace>
 
! -------------------------------------------------------------------
<adding operator> ::= '+' | '-'
! Attributes
! -------------------------------------------------------------------
 
<multiplying operatorAttributes> ::= '*<' |<Attribute '/' |List> 'div>'
|
 
<Attribute List> ::= <Attribute> ',' <Attribute List>
<primary>
::= <unsigned number | <Attribute>
| <variable>
<Attribute> ::= <Attribute Mod> ID <Argument List Opt>
| Identifier '(' <actual parameter list> ')'
| '(' <arithmetic expression> ')'
<Attribute Mod> ::= Assembly
| Module
|
! -------------------------------------------------------------------
! Delegates
! -------------------------------------------------------------------
<Delegate> ::= <Attributes> <Modifiers> Delegate <Method>
| <Attributes> <Modifiers> Delegate <Declare>
 
! -------------------------------------------------------------------
<factor>
! Imports
::= <primary>
! -------------------------------------------------------------------
| <factor> '^' <primary> !Originally an up-arrow
<term>
::= <factor>
| <term> <multiplying operator> <factor>
 
<Imports> ::= Imports <Identifier> <NL>
| Imports ID '=' <Identifier> <NL>
 
! -------------------------------------------------------------------
<simple arithmetic expression>
! Events
::= <term>
! -------------------------------------------------------------------
| <adding operator> <term>
| <simple arithmetic expression> <adding operator> <term>
 
<Event Member> ::= <Attributes> <Modifiers> Event ID <Parameters Or Type> <Implements Opt> <NL>
<if clause> ::= if <Boolean expression> then
 
<Parameters Or Type> ::= <Param List>
<arithmetic expression>
| As <Identifier>
::= <simple arithmetic expression>
| <if clause> <simple arithmetic expression> else <arithmetic expression>
 
<Implements Opt> ::= <Implements>
|
! -------------------------------------------------------------------
! Class
! -------------------------------------------------------------------
 
<Class> ::= <Attributes> <Modifiers> Class ID <NL> <Class Items> End Class <NL>
 
! ====================================================================
! 3.4. Boolean expressions
! ====================================================================
 
<relationalClass operatorItems> ::= '<'Class |Item> '<='Class Items> | '=' | '>=' | '>' | '~='
|
 
<Class Item> ::= <Declare>
| <Method>
| <Property>
| <Var Member>
| <Enumeration>
| <Inherits>
| <Class Implements>
<Inherits> ::= Inherits <Identifier> <NL>
<Class Implements> ::= Implements <ID List> <NL>
 
! -------------------------------------------------------------------
<relation>
! Structures
::= <relation> <relational operator> <simple arithmetic expression>
! -------------------------------------------------------------------
| <simple arithmetic expression>
 
<Structure> ::= <Attributes> <Modifiers> Structure ID <NL> <Structure List> End Structure <NL>
<Boolean primary>
::= <logical value>
| <relation>
 
<Structure List> ::= <Structure Item> <Structure List>
<Boolean secondary>
::= <Boolean primary> |
| not <Boolean primary>
 
<Structure Item> ::= <Implements>
| <Enumeration>
| <Structure>
| <Class>
| <Delegate>
| <Var Member>
| <Event Member>
| <Declare>
| <Method>
| <Property>
 
! -------------------------------------------------------------------
<Boolean factor>
! Module
::= <Boolean secondary>
! -------------------------------------------------------------------
| <Boolean factor> and <Boolean secondary>
 
<Module> ::= <Attributes> <Modifiers> Module ID <NL> <Module Items> End Module <NL>
<Boolean term>
::= <Boolean factor>
| <Boolean term> or <Boolean factor>
 
<Module Items> ::= <Module Item> <Module Items>
<implication>
::= <Boolean term> |
| <implication> implies <Boolean term>
<Module Item> ::= <Declare>
| <Method>
| <Property>
| <Var Member>
| <Enumeration>
| <Option Decl>
 
! -------------------------------------------------------------------
<simple Boolean>
! Interface
::= <implication>
! -------------------------------------------------------------------
| <simple Boolean> eqv <implication>
 
<Interface> ::= <Attributes> <Modifiers> Interface ID <NL> <Interface Items> End Interface <NL>
 
<Boolean expression>
::= <simple Boolean>
| <if clause> <simple Boolean> else <Boolean expression>
 
<Interface Items> ::= <Interface Item> <Interface Items>
|
<Interface Item> ::= <Implements>
| <Event Member>
| <Enum Member>
| <Method Member>
| <Property Member>
 
<Enum Member> ::= <Attributes> <Modifiers> Enum ID <NL>
! ====================================================================
! 3.5. Designational expressions
! ====================================================================
 
<Method Member> ::= <Attributes> <Modifiers> Sub <Sub ID> <Param List> <Handles Or Implements> <NL>
<label>
| <Attributes> <Modifiers> Function ID <Param List> <Type> <Handles Or Implements> <NL>
::= Identifier
| <Unsigned Integer>
 
<Property Member> ::= <Attributes> <Modifiers> Property ID <Param List> <Type> <Handles Or Implements> <NL>
<switch designator>
::= Identifier '[' <subscript expression> ']'
! -------------------------------------------------------------------
! Parameters
! -------------------------------------------------------------------
 
<Param List Opt> ::= <Param List>
<simple designational expression>
::= <label> |
| <switch designator>
| '(' <designational expression> ')'
 
<Param List> ::= '(' <Param Items> ')'
<designational expression>
| '(' ')'
::= <simple designational expression>
| <if clause> <simple designational expression> else <designational expression>
<Param Items> ::= <Param Item> ',' <Param Items>
| <Param Item>
 
<Param Item> ::= <Param Passing> ID <Type>
 
! ====================================================================
! 4.1. Compound statements and blocks
! ====================================================================
 
<Param Passing> ::= ByVal
<unlabelled basic statement>
::= <assignment statement> | ByRef
| <go to statement> | Optional
| !EMPTY | !dummy statement ParamArray
| <procedure statement> |
 
! -------------------------------------------------------------------
! Arguments
! -------------------------------------------------------------------
 
<Argument List Opt> ::= <Argument List>
<basic statement>
::= <unlabelled basic statement> |
| <label> ':' <basic statement>
<Argument List> ::= '(' <Argument Items> ')'
<Argument Items> ::= <Argument> ',' <Argument Items>
| <Argument>
 
<Argument> ::= <Expression>
<unconditional statement>
: | Id ':=' <basic statementExpression>
| !NULL
| <compound statement>
| <block>
! -------------------------------------------------------------------
! Declares (External Procedures)
! -------------------------------------------------------------------
 
<Declare> ::= <Attributes> <Modifiers> Declare <Charset> Sub ID Lib StringLiteral <Alias> <Param List Opt> <NL>
<statement>
| <Attributes> <Modifiers> Declare <Charset> Function ID Lib StringLiteral <Alias> <Param List Opt> <Type> <NL>
::= <unconditional statement>
| <conditional statement>
| <for statement>
 
<Charset> ::= Ansi | Unicode | Auto | !Null
<compound tail>
::= <statement> end
| <statement> ';' <compound tail>
 
<Alias> ::= Alias StringLiteral
<block head>
::= begin <declaration> |
| <block head> ';' <declaration>
 
<unlabelled block>
::= <block head> ';' <compound tail>
 
! -------------------------------------------------------------------
<unlabelled compound>
! Methods
::= begin <compound tail>
! -------------------------------------------------------------------
 
<Method> ::= <Attributes> <Modifiers> Sub <Sub ID> <Param List> <Handles Or Implements> <NL> <Statements> End Sub <NL>
<compound statement>
| <Attributes> <Modifiers> Function ID <Param List> <Type> <Handles Or Implements> <NL> <Statements> End Function <NL>
::= <unlabelled compound>
| <label> ':' <compound statement>
<Sub ID> ::= ID
| New !Class creation
 
<Handles Or Implements> ::= <Implements>
<block>
::= <unlabelled block | <Handles>
| <label> ':' <block> |
 
<Handles> ::= Handles <ID List>
<program>
::= <block>
| <compound statement>
 
! -------------------------------------------------------------------
! Properties
! -------------------------------------------------------------------
<Property> ::= <Attributes> <Modifiers> Property ID <Param List> <Type> <NL> <Property Items> End Property <NL>
 
<Property Items> ::= <Property Item> <Property Items>
! ====================================================================
|
! 4.2. Assignment statements
! ====================================================================
 
<Property Item> ::= Get <NL> <Statements> End Get <NL>
<left part>
| Set <Param List> <NL> <Statements> End Set <NL>
::= <variable> ':='
 
 
! -------------------------------------------------------------------
<left part list>
! Enumerations
::= <left part>
! -------------------------------------------------------------------
| <left part list> <left part>
 
<Enumeration> ::= <Attributes> <Modifiers> Enum ID <NL> <Enum List> End Enum <NL>
<assignment statement>
::= <left part list> <Boolean expression>
 
<Enum List> ::= <Enum Item> <Enum List>
|
 
<Enum Item> ::= Id '=' <Expression> <NL>
| Id <NL>
! ====================================================================
! 4.3. Go to statements
! ====================================================================
 
! -------------------------------------------------------------------
<go to statement> ::= goto <designational expression>
! Variable Declaration
! -------------------------------------------------------------------
 
<Var Decl> ::= <Var Decl Item> ',' <Var Decl>
| <Var Decl Item>
<Var Decl Item> ::= <Var Decl ID> As <Identifier> <Argument List Opt>
| <Var Decl ID> As <Identifier> '=' <Expression> !Initialize
| <Var Decl ID> As New <Identifier> <Argument List Opt>
| <Var Decl ID>
| <Var Decl ID> '=' <Expression> !Initialize
 
<Var Decl ID> ::= ID <Argument List Opt>
! ====================================================================
! 4.4. Dummy statements
! -------------------------------------------------------------------
! ====================================================================
! Normal Statements
! -------------------------------------------------------------------
 
<Statements> ::= <Statement> <Statements>
!<dummy statement> ::= <empty>
|
 
<Statement> ::= <Loop Stm>
| <For Stm>
| <If Stm>
| <Select Stm>
| <SyncLock Stm>
| <Try Stm>
| <With Stm>
| <Option Decl>
| <Local Decl>
| <Non-Block Stm> <NL> !Note the <NL>. A non-block statement can be a full statement
| LABEL <NL>
<Non-Block Stm> ::= Call <Variable>
| ReDim <Var Decl>
| ReDim Preserve <Var Decl>
| Erase ID
| Throw <Value>
| RaiseEvent <Identifier> <Argument List Opt>
| AddHandler <Expression> ',' <Expression>
| RemoveHandler <Expression> ',' <Expression>
| Exit Do
| Exit For
| Exit Function
| Exit Property
| Exit Select
| Exit Sub
| Exit Try
| Exit While
| GoTo ID !Argh - they still have this
| Return <Value>
 
| Error <Value> !Raise an error by number
! ====================================================================
| On Error GoTo IntLiteral ! 0 This is obsolete.
! 4.5. Conditional statements
| On Error GoTo '-' IntLiteral !-1 This is obsolete.
! ====================================================================
| On Error GoTo Id
| On Error Resume Next
| Resume ID
| Resume Next
| <Variable> <Assign Op> <Expression>
| <Variable>
| <Method Call>
 
<Assign Op> ::= '=' | '^=' | '*=' | '/=' | '\=' | '+=' | '-=' | '&=' | '<<=' | '>>='
<if statement> ::= <if clause> <unconditional statement>
 
<conditional statement>
::= <if statement>
| <if statement> else <statement>
| <if clause> <for statement>
| <label> ':' <conditional statement>
 
! -------------------------------------------------------------------
! Local declarations
! -------------------------------------------------------------------
 
<Local Decl> ::= Dim <Var Decl> <NL>
! ====================================================================
| Const <Var Decl> <NL>
! 4.6. For statements
| Static <Var Decl> <NL>
! ====================================================================
 
! -------------------------------------------------------------------
<for list element>
! Do Statement
::= <arithmetic expression>
! -------------------------------------------------------------------
| <arithmetic expression> step <arithmetic expression> until <arithmetic expression>
| <arithmetic expression> while <Boolean expression>
 
<Loop Stm> ::= Do <Test Type> <Expression> <NL> <Statements> Loop <NL>
<for list>
| Do <NL> <Statements> Loop <Test Type> <Expression> <NL>
::= <for list element>
| While <forExpression> list<NL> ',' <forStatements> listEnd elementWhile <NL>
 
<Test Type> ::= While
<for clause> ::= for <variable> ':=' <for list> do
| Until
 
! -------------------------------------------------------------------
<for statement>
! For Statement
::= <for clause> <statement>
! -------------------------------------------------------------------
| <label> ':' <for statement>
 
<For Stm> ::= For <Identifier> '=' <Expression> To <Expression> <Step Opt> <NL> <Statements> Next <NL>
| For Each <Variable> In <Variable> <NL> <Statements> Next <NL>
 
<Step Opt> ::= Step <Expression>
! ====================================================================
|
! 4.7. Procedure statements
! ====================================================================
 
 
! -------------------------------------------------------------------
<procedure statement>
! If Statement
::= Identifier '(' <actual parameter list> ')'
! -------------------------------------------------------------------
| Identifier
 
<If Stm> ::= If <Expression> <Then Opt> <NL> <Statements> <If Blocks> End If <NL>
| If <Expression> Then <Non-Block Stm> <NL>
| If <Expression> Then <Non-Block Stm> Else <Non-Block Stm> <NL>
 
<Then Opt> ::= Then !!The reserved word 'Then' is optional for Block-If statements
! ====================================================================
|
! 5. Declarations
! ====================================================================
 
<If Blocks> ::= ElseIf <Expression> <Then Opt> <NL> <Statements> <If Blocks>
<declaration>
::= | Else <typeNL> declaration<Statements>
| <array declaration> |
| <switch declaration>
| <procedure declaration>
 
! -------------------------------------------------------------------
! Select Statement
! -------------------------------------------------------------------
 
<Select Stm> ::= Select <Case Opt> <Expression> <NL> <Select Blocks> End Select <NL>
! ====================================================================
! 5.1. Type declarations
! ====================================================================
 
<Case Opt> ::= Case !!The "Case" after Select is optional in VB.NEt
<type list>
::= Identifier |
| Identifier ',' <type list>
 
<type>
::= real
| integer
| Boolean
 
<Select Blocks> ::= Case <Case Clauses> <NL> <Statements> <Select Blocks>
<local or own type>
::= | Case Else <typeNL> <Statements>
| own <type>
 
<Case Clauses> ::= <Case Clause> ',' <Case Clauses>
<type declaration>
::= <local or own type> | <typeCase listClause>
 
<Case Clause> ::= <Is Opt> <Compare Op> <Expression>
| <Expression>
| <Expression> To <Expression>
 
<Is Opt> ::= Is
! ====================================================================
| !Null
! 5.2. Array declarations
! ====================================================================
<lower bound> ::= <arithmetic expression>
<upper bound> ::= <arithmetic expression>
<bound pair> ::= <lower bound> ':' <upper bound>
<bound pair list>
::= <bound pair>
| <bound pair list> ',' <bound pair>
<array segment>
::= Identifier '[' <bound pair list> ']'
| Identifier ',' <array segment>
<array list>
::= <array segment>
| <array list> ',' <array segment>
<array declaration>
::= array <array list>
| <local or own type> array <array list>
 
! -------------------------------------------------------------------
! ====================================================================
! SyncLock Statement
! 5.3. Switch declarations
! -------------------------------------------------------------------
! ====================================================================
 
<SyncLock Stm> ::= SyncLock <NL> <Statements> End SyncLock <NL>
<switch list>
::= <designational expression>
| <switch list> ',' <designational expression>
 
! -------------------------------------------------------------------
<switch declaration>
! Try Statement
::= switch Identifier ':=' <switch list>
! -------------------------------------------------------------------
 
<Try Stm> ::= Try <NL> <Statements> <Catch Blocks> End Try <NL>
 
<Catch Blocks> ::= <Catch Block> <Catch Blocks>
| <Catch Block>
 
<Catch Block> ::= Catch <Identifier> As ID <NL> <Statements>
| Catch <NL> <Statements>
 
! -------------------------------------------------------------------
! With Statement
! -------------------------------------------------------------------
 
<With Stm> ::= With <Value> <NL> <Statements> End With <NL>
! -------------------------------------------------------------------
! Expressions
! -------------------------------------------------------------------
 
<Expression> ::= <And Exp> Or <Expression>
| <And Exp> OrElse <Expression>
| <And Exp> XOr <Expression>
| <And Exp>
 
<And Exp> ::= <Not Exp> And <And Exp>
| <Not Exp> AndAlso <And Exp>
| <Not Exp>
<Not Exp> ::= NOT <Compare Exp>
| <Compare Exp>
 
<Compare Exp> ::= <Shift Exp> <Compare Op> <Compare Exp> !e.g. x < y
! ====================================================================
| TypeOf <Add Exp> Is <Object>
! 5.4. Procedure declarations
| <Shift Exp> Is <Object>
! ====================================================================
| <Shift Exp> Like <Value>
| <Shift Exp>
 
<Shift Exp> ::= <Concat Exp> '<<' <Shift Exp>
<formal parameter>
| <Concat Exp> '>>' <Shift Exp>
::= Identifier
| <Concat Exp>
 
<Concat Exp> ::= <Add Exp> '&' <Concat Exp>
<formal parameter list>
::= | <formalAdd parameterExp>
| <formal parameter list> <parameter delimiter> <formal parameter>
 
<Add Exp> ::= <Modulus Exp> '+' <Add Exp>
<formal parameter part>
::= !EMPTY | <Modulus Exp> '-' <Add Exp>
| '(' <formal parameter list | <Modulus Exp> ')'
 
<Modulus Exp> ::= <Int Div Exp> Mod <Modulus Exp>
<identifier list>
::= Identifier | <Int Div Exp>
| <identifier list> ',' Identifier
 
<Int Div Exp> ::= <Mult Exp> '\' <Int Div Exp>
<value part>
::= value <identifier list> ';' | <Mult Exp>
| !EMPTY
 
<Mult Exp> ::= <Negate Exp> '*' <Mult Exp>
<specifier>
::= string | <Negate Exp> '/' <Mult Exp>
| | <typeNegate Exp>
| array
| <type> array
| label
| switch
| procedure
| <type> procedure
 
<Negate Exp> ::= '-' <Power Exp>
<specification part>
::= !EMPTY | <Power Exp>
| <specification>
!=== The following rule was added
 
<Power Exp> ::= <Power Exp> '^' <Value>
<specification>
::= | <specifier> <identifier listValue> ';'
| <specification> <specifier> <identifier list> ';'
 
<Value> ::= '(' <Expression> ')'
| New <Identifier> <Argument List Opt>
| IntLiteral
| HexLiteral
| OctLiteral
| StringLiteral
| CharLiteral
| RealLiteral
| DateLiteral
| True
| False
| Me
| MyClass
| MyBase
| Nothing
| <Variable>
| AddressOf <Identifier>
 
<Object> ::= <Identifier> !Object identifiers
| Me
| MyClass
| MyBase
| Nothing
 
<Variable> ::= <Identifier> <Argument List Opt> <Method Calls>
<procedure heading>
::= Identifier <formal parameter part> ';' <value part> <specification part>
<Method Calls> ::= <Method Call> <Method Calls>
|
 
<Method Call> ::= MemberID <Argument List Opt>
<procedure body>
::= <statement>
!!! | <code> !<code> refers to any embedded non-Algol code
 
<procedure declaration>
::= procedure <procedure heading> <procedure body>
| <type> procedure <procedure heading> <procedure body>
 
<Identifier> ::= ID | QualifiedID !Any type of identifier
</pre>
</pre></div>
=={{header|ALGOL 68}}==
=={{header|APL}}==
=={{header|AWK}}==
=={{header|ActionScript}}==
=={{header|Ada}}==
=={{header|Agda2}}==
=={{header|AmigaE}}==
=={{header|AppleScript}}==
=={{header|Assembly}}==
=={{header|AutoHotkey}}==
=={{header|BASIC}}==
=={{header|Bc}}==
=={{header|Befunge}}==
=={{header|Brainf***}}==
=={{header|C}}==
=={{header|C sharp}}==
=={{header|C++}}==
=={{header|Caml}}==
=={{header|Clean}}==
=={{header|Clojure}}==
=={{header|Cobol}}==
=={{header|ColdFusion}}==
=={{header|Common Lisp}}==
=={{header|Component Pascal}}==
=={{header|Coq}}==
=={{header|D}}==
=={{header|DOS Batch File}}==
=={{header|Dc}}==
=={{header|Delphi}}==
=={{header|E}}==
=={{header|EC}}==
=={{header|ELLA}}==
=={{header|ESQL}}==
=={{header|Eiffel}}==
=={{header|Emacs Lisp}}==
=={{header|Erlang}}==
=={{header|F}}==
=={{header|F Sharp}}==
=={{header|FALSE}}==
=={{header|FP}}==
=={{header|Factor}}==
=={{header|Fan}}==
=={{header|Forth}}==
=={{header|Fortran}}==
=={{header|GAP}}==
=={{header|Gnuplot}}==
=={{header|Groovy}}==
=={{header|HaXe}}==
=={{header|Haskell}}==
=={{header|IDL}}==
=={{header|Icon}}==
=={{header|Io}}==
=={{header|J}}==
=={{header|JSON}}==
=={{header|JScript.NET}}==
=={{header|Java}}==
=={{header|JavaScript}}==
=={{header|JoCaml}}==
=={{header|Joy}}==
=={{header|JudoScript}}==
=={{header|Korn Shell}}==
=={{header|LSE64}}==
=={{header|LaTeX}}==
=={{header|LabVIEW}}==
=={{header|Lisaac}}==
=={{header|Lisp}}==
=={{header|Logo}}==
=={{header|Logtalk}}==
=={{header|LotusScript}}==
=={{header|Lua}}==
=={{header|Lucid}}==
=={{header|M4}}==
=={{header|MAXScript}}==
=={{header|MIRC Scripting Language}}==
=={{header|MS SQL}}==
=={{header|Make}}==
=={{header|Maple}}==
=={{header|Mathematica}}==
=={{header|Maxima}}==
=={{header|Metafont}}==
=={{header|Modula-3}}==
=={{header|NewLISP}}==
=={{header|Nial}}==
=={{header|OCaml}}==
=={{header|Oberon-2}}==
=={{header|Object Pascal}}==
=={{header|Objective-C}}==
=={{header|Octave}}==
=={{header|Omega}}==
=={{header|OpenEdge/Progress}}==
=={{header|Oz}}==
=={{header|PHP}}==
=={{header|PL/I}}==
=={{header|PL/SQL}}==
=={{header|Pascal}}==
=={{header|Perl}}==
=={{header|Pike}}==
=={{header|PlainTeX}}==
=={{header|Pop11}}==
=={{header|PostScript}}==
=={{header|PowerShell}}==
=={{header|Prolog}}==
=={{header|Python}}==
=={{header|Q}}==
=={{header|R}}==
=={{header|REXX}}==
=={{header|RapidQ}}==
=={{header|Raven}}==
=={{header|Rhope}}==
=={{header|Ruby}}==
=={{header|SAS}}==
=={{header|SETL}}==
=={{header|SMEQL}}==
=={{header|SNUSP}}==
=={{header|SQL}}==
=={{header|Scala}}==
=={{header|Scheme}}==
=={{header|Script3D}}==
=={{header|Seed7}}==
=={{header|Self}}==
=={{header|Slate}}==
=={{header|Smalltalk}}==
=={{header|Standard ML}}==
=={{header|TI-83 BASIC}}==
=={{header|TI-89 BASIC}}==
=={{header|Tcl}}==
=={{header|Toka}}==
=={{header|Tr}}==
=={{header|Transact-SQL}}==
=={{header|Twelf}}==
=={{header|UNIX Shell}}==
=={{header|UnixPipes}}==
=={{header|Unlambda}}==
=={{header|V}}==
=={{header|VBScript}}==
=={{header|Vedit macro language}}==
=={{header|Visual Basic}}==
=={{header|Visual Basic .NET}}==
=={{header|Visual Objects}}==
=={{header|Wrapl}}==
=={{header|XSLT}}==
=={{header|XTalk}}==