load lex ; /* See the file 'lex.wrk' in the aiTRAN library. */ /* One fully worked example: Producing lex info for C numeric constants */ dcl Tkn_cmt : lex ; dcl Val_oct, Val_int, Val_hex, Val_flt : lex ; say Tkn_cmt <== LIT("/*") <&> OPT(SOM(NAY("*") <|> (ANY("*") <&> NAY("/")))) <&> LIT("*/") ; say Val_oct <== ANY("0") <&> SPN('0'---'7') <&> OPT(ANY("Ll")) ; say Val_int <== SPN('0'---'9') <&> OPT(ANY("Ll")) ; say Val_hex <== ANY("0") <&> ANY("Xx") <&> SPN('0'---'9'<> 'a'---'f'<> 'A'---'F') <&> OPT(ANY("Ll")) ; say Val_flt <== let dex === SPN ( '0' --- '9' ) in let dot === ANY(".") in let num33 === dot <&> dex in let num34 === dot <&> dex <&> ANY("Ee") in let num36 === dot <&> dex <&> ANY("Ee") <&> dex in let num38 === dot <&> dex <&> ANY("Ee") <&> ANY("+-") <&> dex in let num11 === dex <&> ANY("Ee") in let num13 === dex <&> ANY("Ee") <&> dex in let num15 === dex <&> ANY("Ee") <&> ANY("+-") < &> dex in let num19 === dex <&> dot in let num20 === dex <&> dot <&> dex in let num21 === dex <&> dot <&> dex <&> ANY("Ee") in let num23 === dex <&> dot <&> dex <&> ANY("Ee") <&> dex in let num25 === dex <&> dot <&> dex <&> ANY("Ee") <&> ANY("+-") <&> dex in let num27 === dex <&> dot <&> ANY("Ee") in let num29 === dex <&> dot <&> ANY("Ee") <&> dex in let num31 === dex <&> dot <&> ANY("Ee") <&> ANY("+-") <&> dex in num11 <|> num13 <|> num15 <|> num19 <|> num20 <|> num21 <|> num23 <|> num25 <|> num27 <|> num29 <|> num31 <|> num33 <|> num34 <|> num36 <|> num38 ; dcl Val__oct : str ; say Val__oct <== LexShow(Val_oct) ; write "\n\nOct: " <> num2str(length(Val__oct)) <> "\n" <> Val__oct ; dcl Val__int : str ; say Val__int <== LexShow(Val_int) ; write "\n\nInt: " <> num2str(length(Val__int)) <> "\n" <> Val__int ; dcl Val__hex : str ; say Val__hex <== LexShow(Val_hex) ; write "\n\nHex: " <> num2str(length(Val__hex)) <> "\n" <> Val__hex ; dcl Val__flt : str ; say Val__flt <== LexShow(Val_flt) ; write "\n\nFlt: " <> num2str(length(Val__flt)) <> "\n" <> Val__flt ; cshow off; write ( [ Val__oct <> "\n\n" <> Val__int <> "\n\n" <> Val__hex <> "\n\n" <> Val__flt ] ) to "Values.lex" ; cshow on;