


## match.pkg
## John Reppy (http://www.cs.uchicago.edu/~jhr)
## Aaron Turon (adrassi@gmail.com)
## All rights reserved.
# Compiled by:
# src/app/future-lex/src/lexgen.lib# A simple match "backend" that runs the produced state machine directly
# on stdin. Treats end of line as end of input. Note that a match only
# occurs if the machine is in an accepting state after consuming the
# complete input; in particular, the input is meant to represent a single
# token, and the machine does not restart until the end of input.
### "Human reason has this peculiar fate
### that in one species of its knowledge
### it is burdened by questions which,
### as prescribed by the very nature
### of reason itself, it is not able to ignore,
### but which, as transcending all its powers,
### it is also not able to answer."
###
### -- Emmanuel Kant, Critique of Pure Reason
package match: (weak) Output { # Output is from src/app/future-lex/src/backends/output.api package sis= regular_expression::symbol_set; # regular_expression is from src/app/future-lex/src/regular-expression.pkg package lo= lex_output_spec; # lex_output_spec is from src/app/future-lex/src/backends/lex-output-spec.pkg fun match (lo::STATE { id, label, final, next, ... }, [])
=>
final;
match (lo::STATE { id, label, final, next, ... }, symbol ! r)
=>
goto *next
where
fun goto []
=>
[];
goto ((syms, s) ! r')
=>
sis::member (syms, symbol) ?? match (s, r)
:: goto r';
end;
end;
end;
fun match_loop states
=
case (file::read_line file::stdin)
NULL => ();
THE "\n" => ();
THE s
=>
{ chars = list::reverse (list::tail (list::reverse (string::explode s)));
syms = list::map (one_word_unt::from_int o char::to_int) chars;
my q0 as lo::STATE { label, ... }
=
list::head states;
case (match (q0, syms))
[] => print "-- No match --\n";
i ! _ => { print "-- Match: ";
print (regular_expression::to_string (vector::get (label, i)));
print " --\n";
};
esac;
match_loop states; # Continue I/O loop
};
esac;
fun output (lo::SPEC { dfa, ... }, _)
=
match_loop (dfa);
};
## COPYRIGHT (c) 2005
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2012,
## released under Gnu Public Licence version 3.


