%% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Epilog = '%%*.'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id+ / ',' )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence+ / '|'; sequence: term+; term: item ( optional | some | many )?; item: Id | literal | '(' xor ')'; optional: '?'; some: '+' list?; many: '*' list?; literal: String; list: '/' item; %% package oops3; public class EbnfParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Epilog = '%%.*'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id+ / ',' )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence+ / '|'; sequence: ( item | someItems | optionalItem )+; item: Id | literal | '(' xor ')'; someItems: '{' xor '}'; optionalItem: '[' xor ']'; literal: String; %% } package oops3; public class XbnfParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Number = '[1-9][0-9]*'; Epilog = '%%.*'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id+ / ',' )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence+ / '|'; sequence: term+; term: item range?; literal: String; optional: '?'; list: '/' item; some: '+' list?; many: '*' list?; item: Id | literal | '(' xor ')' | or | and; range: range1 | range2 | optional | some | many; or: '[' xors ',' xors+ / ',' ']' list?; and: '{' xors ',' xors+ / ',' '}' list?; xors: xor+; range1: Number ( '..' Number? list? | list )?; range2: '..' ( Number? list? )?; %% } package oops3; public class RfcParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Epilog = '%%.*'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id+ / ',' )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence+ / '|'; sequence: term+; term: item ( optional | some | many )?; item: Id | literal | '(' xor ')'; optional: '?'; some: '+' list?; many: '*' list?; literal: String; list: '/' item; %% } package oops3; public class EbnfParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Epilog = '%%.*'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id ( ',' Id )* )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence ( '|' sequence )*; sequence: ( item | someItems | optionalItem )+; item: Id | literal | '(' xor ')'; someItems: '{' xor '}'; optionalItem: '[' xor ']'; literal: String; %% } package oops3; public class XbnfParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Prolog = '.*%%'; Id = '[a-zA-Z_][-a-zA-Z_0-9.$]*'; String = '\'([^\'\\\r\n]|\\.)*\''; Number = '[1-9][0-9]*'; Epilog = '%%.*'; # rules parser: Prolog rule+ Epilog; rule: type? Id ( pattern | rhs ) ';'; type: '<' ( Id ( ':' Id+ / ',' )? '>' '?'? | '>' ); pattern: '=' String; rhs: ':' xor; xor: sequence+ / '|'; sequence: term+; term: item range?; literal: String; optional: '?'; list: '/' item; some: '+' list?; many: '*' list?; item: Id | literal | '(' xor ')' | or | and; range: range1 | range2 | optional | some | many; or: '[' xor 2.. / ',' ']' list?; and: '{' xor 2.. / ',' '}' list?; range1: Number ( '..' Number? list? | list )?; range2: '..' ( Number? list? )?; %% } package expr; public class ExprParser { %% # patterns Comment = '#.*'; WhiteSpace = '[ \r\t\n]+'; Number = '[0-9]+'; # rules ? sum: product ( add | subtract )*; ? product: term ( multiply | divide )*; add: '+' product; subtract: '-' product; term: Number | '(' sum ')'; multiply: '*' term; divide: '/' term; %% } package test; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules sequence: Number sequence*; %% } package test; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules sequence: Number sequence*; %% } package test; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules sequence: Number nest*; nest: sequence; %% } package test; import java.util.List; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules ? sequence: Number+; %% public static class LeftTree extends Tree { // destructively represent list as left-associative Item tree @SuppressWarnings("unchecked") public Object sequence (int position, List list) { if (list.size() == 1) return list.get(0); Left left = new Left(position, list.subList(0, 2)); for (int n = 2; n < list.size(); ++ n) { list.set(n-1, left); left = new Left(position, list.subList(n-1, n+1)); } return left; } public class Left extends Item { protected Left (int position, List list) { super(position, list); } } } } package test; public class Test { %% # patterns Comment = '#.*'; Number = '[0-9]+'; WhiteSpace = '[ \r\t\n]+'; # rules program: test+; test: n | nList | pairs | or | orList | and | andList; n: 'n' ( a | b | c ) 2..3; nList: 'nList' ( a | b | c ) 2..3 / Number; pairs: 'pairs' ( ( a | b | c | d ) 2 / ',' )+; or: 'or' [ a | b | c | d ]; orList: 'orList' [ a | b 1..2 | c 1..3 | d 2 / '.' ] / Number; and: 'and' { a | b | c | d }; andList: 'andList' { a | b 1..2 | c 1..3 | d 2 / '.' } / Number; a: 'a'; b: 'b'; c: 'c'; d: 'd'; %% } package test; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules sequence: Number sequence+; %% } package test; public class Test { %% # patterns spaces = '[ \n\r\t]+'; Number = '[0-9]+'; # rules statement: 'if' Number statement ( 'else' statement )? | Number; %% }