scanner //Note: scanners don't use stack and node, just read/look and keep/noKeep. //Note: Space = 32; Tab = 9; Cr = 13; Lf = 10; Ff = 12. attribute defaults "noStack" "read" "noNode" "keep". output "All". //One of All, Smalltalk, Ruby, C++, C++98, Java, or JavaList uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ". lowercase = "abcdefghijklmnopqrstuvwxyz". letter = uppercase | lowercase | "_". digit = "0123456789". operator = "!,+-/\*~=@%&?|<>". singleQuote = "'". doubleQuote = '"'. tab = 9 [noKeep]. carriageReturn = 13 [noKeep]. lineFeed = 10 [noKeep]. formFeed = 12 [noKeep]. blank = 32 [noKeep]. //Or "$ [keep]" which is hard to see after the $... lineEnd = carriageReturn | lineFeed | formFeed. space = blank | tab | lineEnd. others = "[]{}()^;#:.$_" | singleQuote | doubleQuote | space. slantedSingleQuote = 96. slantedDoubleQuote = 147 | 148. printable = letter | digit | operator | others | slantedSingleQuote | slantedDoubleQuote. endOfFileCharacter = 256. all = printable | endOfFileCharacter. EndOfFile {endOfFileCharacter} -> => EndOfFile. WhiteSpace {all - space} -> space+. IdentifierOrSymbol {all - (letter | digit | $:)} -> letter (letter | digit | $: )* => walkIdentifier: //Instead of Identifier -> $# [noKeep] letter (letter | digit | $: )* => walkSymbol:. //Instead of Symbol. SingleQuotedStringOrSymbol {all - $'} -> $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* $' [noKeep] => walkString: //String -> $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for single quoted string"] => walkString: //String -> $# [noKeep] $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* $' [noKeep] => walkSymbol: //Instead of Symbol. -> $# [noKeep] $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for single quoted string"] => walkSymbol: . //Instead of Symbol. DoubleQuotedStringOrSymbol {all - $"} -> $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* $" [noKeep] => walkString: //String -> $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for double quoted string"] => walkString: //String -> $# [noKeep] $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* $" [noKeep] => walkSymbol: //Instead of Symbol. -> $# [noKeep] $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for double quoted string"] => walkSymbol: . //Instead of Symbol. Brackets {all} -> $( => "(" -> $) => ")" -> ${ => "{" -> $} => "}" -> $[ => "[" -> $] => "]". RegularExpressionOperator1 {all} -> $| => "|" -> $& => "&" -> $* => "*" -> $+ => "+" -> $? => "?" -> $. $. => "..". RegularExpressionOperator2 {all - $>} -> $- => '-'. Punctuation {all - $.} -> $. => '.'. Arrow1 {all - $>} -> $= => '=' . Arrow2 {all} -> $- $> => "->" -> $= $> => "=>". Other {all} -> $; => ";" . Character {all} -> $$ [noKeep] printable [keep] => walkCharacter: . //Instead of Character. Integer {all - digit} -> digit+ => walkInteger: . //Instead of Integer. Comment {all} -> $/ [noKeep] {all - $/} #syntaxError: ["// is a comment, / alone is not valid"] -> $/ [noKeep] $/ [noKeep] (printable [noKeep] - lineEnd [noKeep])* ( lineEnd [noKeep] | {endOfFileCharacter} ).