This entry contains the "aflex"-compatible grammar; the next will contain the "ayacc"-compatible grammar.
-- Flex-compatible grammar for ParaSail
%START IDENT Z
STRING_LITERAL (\"([^\"]|[\\][.])*\")
CHAR_LITERAL (\'([^\']|[\\][.])\')
IDENTIFIER [a-zA-Z]([_]?[a-zA-Z0-9])*
-- The following are used to match all numeric literals.
-- Note that double underscores are rejected.
DIGIT_SEQUENCE [0-9]([_]?[0-9])*
HEX_SEQUENCE [0-9a-fA-F]([_]?[0-9a-fA-F])*
EXPONENT [Ee][-+]?{DIGIT_SEQUENCE}
%%
-- ParaSail reserved words
"abs" {ECHO_L; ENTER(Z); return (ABS_kw);}
"abstract" {ECHO_L; ENTER(Z); return (ABSTRACT_kw);}
"all" {ECHO_L; ENTER(Z); return (ALL_kw);}
"and" {ECHO_L; ENTER(Z); return (AND_kw);}
"block" {ECHO_L; ENTER(Z); return (BLOCK_kw);}
"case" {ECHO_L; ENTER(Z); return (CASE_kw);}
"class" {ECHO_L; ENTER(Z); return (CLASS_kw);}
"concurrent" {ECHO_L; ENTER(Z); return (CONCURRENT_kw);}
"const" {ECHO_L; ENTER(Z); return (CONST_kw);}
"continue" {ECHO_L; ENTER(Z); return (CONTINUE_kw);}
"each" {ECHO_L; ENTER(Z); return (EACH_kw);}
"else" {ECHO_L; ENTER(Z); return (ELSE_kw);}
"elsif" {ECHO_L; ENTER(Z); return (ELSIF_kw);}
"end" {ECHO_L; ENTER(Z); return (END_kw);}
"exit" {ECHO_L; ENTER(Z); return (EXIT_kw);}
"exports" {ECHO_L; ENTER(Z); return (EXPORTS_kw);}
"extends" {ECHO_L; ENTER(Z); return (EXTENDS_kw);}
"for" {ECHO_L; ENTER(Z); return (FOR_kw);}
"forward" {ECHO_L; ENTER(Z); return (FORWARD_kw);}
"function" {ECHO_L; ENTER(Z); return (FUNCTION_kw);}
"if" {ECHO_L; ENTER(Z); return (IF_kw);}
"import" {ECHO_L; ENTER(Z); return (IMPORT_kw);}
"in" {ECHO_L; ENTER(Z); return (IN_kw);}
"interface" {ECHO_L; ENTER(Z); return (INTERFACE_kw);}
"is" {ECHO_L; ENTER(Z); return (IS_kw);}
"locked" {ECHO_L; ENTER(Z); return (LOCKED_kw);}
"loop" {ECHO_L; ENTER(Z); return (LOOP_kw);}
"mod" {ECHO_L; ENTER(Z); return (MOD_kw);}
"mutable" {ECHO_L; ENTER(Z); return (MUTABLE_kw);}
"new" {ECHO_L; ENTER(Z); return (NEW_kw);}
"not" {ECHO_L; ENTER(Z); return (NOT_kw);}
"null" {ECHO_L; ENTER(Z); return (NULL_kw);}
"of" {ECHO_L; ENTER(Z); return (OF_kw);}
"operator" {ECHO_L; ENTER(Z); return (OPERATOR_kw);}
"optional" {ECHO_L; ENTER(Z); return (OPTIONAL_kw);}
"or" {ECHO_L; ENTER(Z); return (OR_kw);}
"procedure" {ECHO_L; ENTER(Z); return (PROCEDURE_kw);}
"queued" {ECHO_L; ENTER(Z); return (QUEUED_kw);}
"ref" {ECHO_L; ENTER(Z); return (REF_kw);}
"rem" {ECHO_L; ENTER(Z); return (REM_kw);}
"return" {ECHO_L; ENTER(Z); return (RETURN_kw);}
"reverse" {ECHO_L; ENTER(Z); return (REVERSE_kw);}
"select" {ECHO_L; ENTER(Z); return (SELECT_kw);}
"some" {ECHO_L; ENTER(Z); return (SOME_kw);}
"then" {ECHO_L; ENTER(Z); return (THEN_kw);}
"type" {ECHO_L; ENTER(Z); return (TYPE_kw);}
"var" {ECHO_L; ENTER(Z); return (VAR_kw);}
"while" {ECHO_L; ENTER(Z); return (WHILE_kw);}
"with" {ECHO_L; ENTER(Z); return (WITH_kw);}
"xor" {ECHO_L; ENTER(Z); return (XOR_kw);}
-- Match all the compound ParaSail delimiters.
"=?" {ECHO_L; ENTER(Z); return(COMPARE);}
"==" {ECHO_L; ENTER(Z); return(EQ);}
"!=" {ECHO_L; ENTER(Z); return(NEQ);}
">=" {ECHO_L; ENTER(Z); return(GEQ);}
"<=" {ECHO_L; ENTER(Z); return(LEQ);}
"**" {ECHO_L; ENTER(Z); return(POWER);}
":=" {ECHO_L; ENTER(Z); return(ASSIGN);}
":=:" {ECHO_L; ENTER(Z); return(SWAP);}
".." {ECHO_L; ENTER(Z); return(DOT_DOT);}
"::" {ECHO_L; ENTER(Z); return(DOUBLE_COLON);}
"[[" {ECHO_L; ENTER(Z); return(DOUBLE_LEFT_BRACKET);}
"]]" {ECHO_L; ENTER(Z); return(DOUBLE_RIGHT_BRACKET);}
"=>" {ECHO_L; ENTER(Z); return(REFERS_TO);}
"->" {ECHO_L; ENTER(Z); return(GIVES);}
"==>" {ECHO_L; ENTER(Z); return(IMPLIES);}
";;" {ECHO_L; ENTER(Z); return(SEQUENCE);}
"||" {ECHO_L; ENTER(Z); return(PARALLEL);}
-- Match all the ParaSail single-character delimiters.
<IDENT>\' {ECHO_L; ENTER(Z); return(PRIME);}
"(" {ECHO_L; ENTER(Z); return('(');}
")" {ECHO_L; ENTER(IDENT); return(')');}
"[" {ECHO_L; ENTER(Z); return('[');}
"]" {ECHO_L; ENTER(IDENT); return(']');}
"<" {ECHO_L; ENTER(Z); return('<');}
">" {ECHO_L; ENTER(Z); return('>');}
"{" {ECHO_L; ENTER(Z); return('{');}
"}" {ECHO_L; ENTER(Z); return('}');}
"*" {ECHO_L; ENTER(Z); return('*');}
"+" {ECHO_L; ENTER(Z); return('+');}
"," {ECHO_L; ENTER(Z); return(',');}
"-" {ECHO_L; ENTER(Z); return('-');}
"." {ECHO_L; ENTER(Z); return('.');}
"/" {ECHO_L; ENTER(Z); return('/');}
":" {ECHO_L; ENTER(Z); return(':');}
";" {ECHO_L; ENTER(Z); return(';');}
"|" {ECHO_L; ENTER(Z); return('|');}
"?" {ECHO_L; ENTER(Z); return('?');}
"~" {ECHO_L; ENTER(Z); return('~');}
-- The following is used to match all valid ParaSail identifiers
-- except reserved words. Note that leading digits and underscores
-- are not allowed and that double underscores are not allowed.
{IDENTIFIER} {ECHO_L; ENTER(IDENT);return(Identifier);}
-- Enumeration literals
[#]{IDENTIFIER} {ECHO_L; ENTER(IDENT);return(Enum_Literal);}
-- Decimal numeric literals
{DIGIT_SEQUENCE}{EXPONENT}? {
ECHO_L; ENTER(Z);
return(Integer_Literal);}
{DIGIT_SEQUENCE}[.]{DIGIT_SEQUENCE}{EXPONENT}? {
ECHO_L; ENTER(Z);
return(Real_Literal);}
-- Based numeric literals.
{DIGIT_SEQUENCE}[#]{HEX_SEQUENCE}[#]{EXPONENT}? {
ECHO_L; ENTER(Z);
return(Integer_Literal);}
{DIGIT_SEQUENCE}[#]{HEX_SEQUENCE}[.]{HEX_SEQUENCE}[#]{EXPONENT}? {
ECHO_L; ENTER(Z);
return(Real_Literal);}
"0"[xX]{HEX_SEQUENCE} {ECHO_L; ENTER(Z); return(Integer_Literal);}
"0"[bB]{DIGIT_SEQUENCE} {ECHO_L; ENTER(Z); return(Integer_Literal);}
-- Match all valid character literals.
<Z>{CHAR_LITERAL} {ECHO_L; ENTER(Z); return(Char_Literal);}
-- Match all valid string literals.
{STRING_LITERAL} {ECHO_L; ENTER(Z); return(String_Literal);}
"//".* {ECHO_L;} -- ignore comments to end-of-line
"--".* {ECHO_L;} -- ignore comments to end-of-line
-- The following matches all whitespace. Except for vertical tabs. AFLEX,
-- ALEX and LEX do not support vertical tabs.
[ \r\t\f]+ {ECHO_L;} -- ignore spaces,Carriage returns,tabs,form feeds
-- The following matches all new lines.
[\n] {ECHO_L; linenum;}
-- The following matches everything else and prints an error message
-- indicating that something unexpected was found.
. {ECHO_L;
text_io.put_line("?? lexical error '" &
parasail_lex_dfa.yytext & "' ??");
num_errors := num_errors + 1;}
%%
with parasail_tokens;
use parasail_tokens;
use text_io;
package parasail_lex is
lines : positive := 1;
num_errors : natural := 0;
Trace : Boolean := False;
procedure ECHO_L; --local version_of define_string.
procedure linenum;
function yylex return token;
end parasail_lex;
package body parasail_lex is
procedure ECHO_L is
--
-- Local version of the define string.
--
begin
text_io.put(yytext);
end ECHO_L;
procedure linenum is
line_number_string : constant string :=
integer'image ( lines );
begin
lines := lines + 1;
put(line_number_string);
for i in 1 .. 5 - integer ( line_number_string'length ) loop
text_io.put(" ");
end loop;
end linenum;
##
end parasail_lex;
No comments:
Post a Comment