Jump to content

BNF Grammar: Difference between revisions

9,696 bytes removed ,  14 years ago
Line 4,319:
 
=={{header|Perl}}==
The BNF description follows, [http://perl.comsci.us/syntax/statement/index.html Perl Syntax]
<div style="height:30ex;overflow:scroll"><pre>
! -----------------------------------------------------------------------
! Perl.grm
!
!
! -----------------------------------------------------------------------
 
! -----------------------------------------------------------------------
! This grammar does not contain the compiler directives.
!
! Note: This is an ad hoc version of the language. If there are any flaws,
! please visit the contact page and tell me.
!
! SPECIAL THANKS TO:
! Scott Gever (who taught me most of what I know about Perl)
!
! Modified 04/28/2009
! -----------------------------------------------------------------------
 
 
"Name" = 'Perl'
"Version" = '5.0'
"Author" = 'Robin Randall (Larry Wall wrote Perl)'
"About" = 'Perl is one of the most common, and complex, programming languages in use today.'
 
"Case Sensitive" = True
"Start Symbol" = <Decls>
 
{Hex Digit} = {Digit} + [abcdefABCDEF]
{Oct Digit} = [01234567]
 
{Id Head} = {Letter} + [_]
{Id Tail} = {Id Head} + {Digit}
 
{String} = {Printable} - ["\]
!GIM = [g]?[i]?[m]?
DecLiteral = [123456789]{digit}*
OctLiteral = 0{Oct Digit}*
HexLiteral = 0x{Hex Digit}+
FloatLiteral = {Digit}*'.'{Digit}+
 
StringLiteral = '"'( {String} | '\'{Printable} )* '"'
!CharLiteral = '' ( {Char} | '\'{Printable} )''
 
Id = {Id Head}{Id Tail}*
{Spec} = [.?*+-_^$()#@%&,;:<>\|/{}~] + ['['] + [']'] + ['='] + [' ']
{Char} = {Printable} - {Spec}
 
! ===================================================================
! Comments
! ===================================================================
 
Comment Line = '#'
 
!
!
!
Whitespace = {Whitespace}+
! | '#'{Printable}*
!
!
! POD = '='{Printable}* '=' cut
!=======================================================
! Preparation
!=======================================================
<Decls> ::= <Decl> <Decls>
|
 
<Decl> ::= <Sub Decl>
| <Sub Proto>
| <Var Decl>
| <Prep Stm>
 
<Prep Stm> ::= use <Op Prep>
| requires <Module>
| enum <Module>
 
<Op Prep> ::= strict ';'
| warnings ';'
| constant Id '=>' <Expr> ';'
| <Module>
 
<Module> ::= Id '::' Id ';'
| Id ';'
! ===================================================================
! Function Declaration
! ===================================================================
 
<Sub Proto> ::= sub <Sub ID> '(' <Params> ')' ';'
|sub <Sub ID> '(' ')' ';'
 
<Sub Decl> ::= sub <Sub ID> '(' <Params> ')' <Block>
| sub <Sub ID> '(' <Id List> ')' <Block>
| sub <Sub ID> '(' ')' <Block>
 
 
<Params> ::= <Param> ',' <Params>
| <Param>
<Param> ::= const <Type> Id
| <Type> Id
| <Type>'_'
<Id List> ::= Id ',' <Id List>
| Id
 
<Sub ID> ::= '&'Id
| Id
 
! ===================================================================
! Type Declaration
! ===================================================================
 
 
! ===================================================================
! Variable Declaration
! ===================================================================
 
<Var Decl> ::= <Mod> <Var> ',' <Var List> ';'
| <Mod> <Var> ';'
| <Var> ';'
 
<Var> ::= <Type> '_' !Default
| <Type> '\' '=' <Op Assign>
| <Type> Id '=' <Op Assign>
| <Type> Id
 
<Var List> ::= <Var Item> ',' <Var List>
| <Var Item>
 
<Var Item> ::= <Scalar>
| <Array>
| <Hash>
| <Ref>
<Mod> ::= const
| undef
| my
| sub
 
! ===================================================================
! Types
! ===================================================================
 
<Type> ::= '$' !Scalar
| '@' !Array
| '%' !Hash
| '&' !Subroutine
| '\' !Reference
|
 
<Scalar> ::= '$' Id
| '$' Id '[' <Expr> ']'
 
<Array> ::= '@' Id
<Hash> ::= '%' Id
<Ref> ::= '\' <Var Item>
 
! ===================================================================
! Statements
! ===================================================================
 
<Stm> ::= <Var Decl>
| Id ':' ';'
| Id ':' <Comp Stm>
| <Comp Stm>
| Id ':' <Normal Stm> ';'
| <Normal Stm> ';'
| <Normal Stm> <Stm Mod> ';'
 
<Comp Stm> ::= if '(' <Expr> ')' <Block> else <Block>
| if '(' <Expr> ')' <Block> elsif '(' <Expr> ')' <Block>
| while '(' <Expr> ')' <Block>
| while '(' <Expr> ')' <Block> continue <Block>
| until '(' <Expr> ')' <Block>
| until '(' <Expr> ')' <Block> continue <Block>
| for '(' <Expr> ';' <Expr> ';' <Expr> ')' <Block>
| foreach <Value> '(' <List> ')' <Block>
| foreach <Value> '(' <List> ')' <Block> continue <Block>
| <Block> continue <Block>
| <Block>
| do <Block>
 
<Normal Stm> ::= <Expr>
! | goto Label
! | goto <Expr>
| break
| next
| last
| redo
| continue
| reset
| return <Expr>
| !Null statement
 
 
<Block> ::= '{' <Stm List> '}'
 
<Stm List> ::= <Stm> <Stm List>
| <Stm>
 
<Stm Mod> ::= if <Expr>
| unless <Expr>
| while <Expr>
| until <Expr>
| foreach <List>
<List> ::= <Value> ',' <List>
| <Value>'..'<Value>
|
! ===================================================================
! Here begins Perl's 15 levels of operator precedence.
! ===================================================================
 
<Expr> ::= <Expr> ',' <Op Assign>
| <Op Assign>
| '<'ID'>'
 
 
<Op Assign> ::= <Op If> '=' <Op Assign>
| <Op If> '+=' <Op Assign>
| <Op If> '-=' <Op Assign>
| <Op If> '*=' <Op Assign>
| <Op If> '/=' <Op Assign>
| <Op If> '^=' <Op Assign>
| <Op If> '&=' <Op Assign>
| <Op If> '|=' <Op Assign>
| <Op If> '>>=' <Op Assign>
| <Op If> '<<=' <Op Assign>
| <Op If>
 
<Op If> ::= <Op Or> '?' <Op If> ':' <Op If>
| <Op Or>
 
<Op Or> ::= <Op Or> '||' <Op And>
| <Op And>
 
<Op And> ::= <Op And> '&&' <Op BinOR>
| <Op BinOR>
 
<Op BinOR> ::= <Op BinOr> '|' <Op BinXOR>
| <Op BinXOR>
 
<Op BinXOR> ::= <Op BinXOR> '^' <Op BinAND>
| <Op BinAND>
 
<Op BinAND> ::= <Op BinAND> '&' <Op Equate>
| <Op Equate>
 
<Op Equate> ::= <Op Equate> '==' <Op Compare>
| <Op Equate> '!=' <Op Compare>
| <Op Equate> '=~' 's/' <RE>'/' <Expr> '/' !GIM
| <Op Equate> '=~' 'm/' <RE>'/' !GIM
| <Op Equate> '=~' '/' <RE>'/' !GIM
| <Op Compare>
 
 
 
<Op Compare> ::= <Op Compare> '<' <Op Shift>
| <Op Compare> '>' <Op Shift>
| <Op Compare> '<=' <Op Shift>
| <Op Compare> '>=' <Op Shift>
| <Op Shift>
 
<Op Shift> ::= <Op Shift> '<<' <Op Add>
| <Op Shift> '>>' <Op Add>
| <Op Add>
 
<Op Add> ::= <Op Add> '+' <Op Mult>
| <Op Add> '-' <Op Mult>
| <Op Mult>
 
<Op Mult> ::= <Op Mult> '*' <Op Unary>
| <Op Mult> '/' <Op Unary>
| <Op Mult> '%' <Op Unary>
| <Op Unary>
| <Value>
 
<Op Unary> ::= '\!' <Op Unary>
| '~' <Op Unary>
| '-' <Op Unary>
| '*' <Op Unary>
| '&' <Op Unary>
| '++' <Op Unary>
| '--' <Op Unary>
 
<Value> ::= OctLiteral
| HexLiteral
| DecLiteral
| StringLiteral
| FloatLiteral
| <Type> Id '(' <Expr> ')'
| <Type> Id '(' ')'
| '(' <Expr> ')'
!====================================================
! Regular Expressions
!====================================================
<RE> ::= <union>
| <simple-RE>
<union> ::= <RE> '|' <simple-RE>
| '^' <simple-RE>
| <simple-RE> '$'
| '^' <simple-RE> '$'
<simple-RE> ::= <concat>
| <basic-RE>
<concat> ::= <simple-RE> <basic-RE>
<basic-RE> ::= <star>
| <plus>
| <elem-RE>
<star> ::= <elem-RE> '*'
<plus> ::= <elem-RE> '+'
<elem-RE> ::= <group>
| <any>
| <set>
 
<group> ::= '(' <RE> ')'
<any> ::= '.'
<set> ::= <pos-set>
| <neg-set>
<pos-set> ::= '[' <set-items> ']'
<neg-set> ::= '[^' <set-items> ']'
<set-items> ::= <set-item>
| <set-item> <set-items>
<set-item> ::= <range>
| char
<range> ::= char '-' char
char = {Char}
</pre></div>
 
=={{header|Python}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.