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, or Java 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. EndOfFile {endOfFileCharacter} -> => '-|'. WhiteSpace {all - space} -> space+. IdentifierOrSymbol {all - (letter | digit | $:)} -> letter (letter | digit | $: )* => walkIdentifier: -> $# [noKeep] letter (letter | digit | $: )* => walkSymbol:. SingleQuotedStringOrSymbol {all - $'} -> $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* $' [noKeep] => walkString: -> $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for single quoted string"] => walkString: -> $# [noKeep] $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* $' [noKeep] => walkSymbol: -> $# [noKeep] $' [noKeep] ((printable - $') [keep] | $' [noKeep] $' [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for single quoted string"] => walkSymbol:. DoubleQuotedStringOrSymbol {all - $"} -> $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* $" [noKeep] => walkString: -> $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for double quoted string"] => walkString: -> $# [noKeep] $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* $" [noKeep] => walkSymbol: -> $# [noKeep] $" [noKeep] ((printable - $") [keep] | $" [noKeep] $" [keep])* {endOfFileCharacter} #syntaxError: ["missing end quote for double quoted string"] => walkSymbol:. Brackets {all} -> $( => OpenRound -> $) => CloseRound -> ${ => OpenCurly -> $} => CloseCurly -> $[ => OpenSquare -> $] => CloseSquare. RegularExpressionOperator1 {all} -> $| => Or -> $& => And -> $* => Star -> $+ => Plus -> $? => QuestionMark -> $. $. => DotDot. RegularExpressionOperator2 {all - $>} -> $- => Minus. Punctuation {all - $.} -> $. => Dot. Arrow1 {all - $>} -> $= => Equals . Arrow2 {all} -> $- $> => RightArrow -> $= $> => FatRightArrow. Character {all} -> $$ [noKeep] printable [keep] => walkCharacter:. Integer {all - digit} -> digit+ => walkInteger:. Comment {all} -> $/ [noKeep] {all - $/} #syntaxError: ["// is a comment, / alone is not valid"] -> $/ [noKeep] $/ [noKeep] (printable [noKeep] - lineEnd [noKeep])* ( lineEnd [noKeep] | {endOfFileCharacter} ).