Mercurial > hg > ltpda
diff m-toolbox/classes/@LTPDAworkbench/parse.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@LTPDAworkbench/parse.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,112 @@ +% PARSE an LTPDA command +% +% Try to parse out: +% output vars +% input vars +% method name +% plists +% comment at end of line +% +% $Id: parse.m,v 1.2 2010/08/06 19:10:49 ingo Exp $ +% +function out = parse(cmd) + + cmd = strtrim(cmd); + + % get comment + st = regexp(cmd, '%', 'split'); + if numel(st)>1 + cmt = st{2}; + else + cmt = ''; + end + + % get method + str = st{1}; + mtdend = length(str); + for kk=1:length(str) + if str(kk) == '(' + mtdend = kk-1; + break; + end + end + mtdstart = 1; + for kk=1:mtdend + if str(kk) == '=' + mtdstart = kk+1; + break; + end + end + method = strtrim(regexp(str(mtdstart:mtdend), '\w*', 'match')); + method = method{1}; + + % get output + output = ''; + for kk=1:mtdstart + if str(kk) == '=' + output = str(1:kk-1); + break; + end + end + output = strrep(output, '[', ''); + output = strrep(output, ']', ''); + if ~isempty(output) + outvars = regexp(output, ',*\s*', 'split'); + else + outvars = {}; + end + + pls = {}; + pl = ''; + rest = strrep(cmd, pl, ''); + plstart = regexp(rest, 'plist\(', 'start'); + while ~isempty(plstart) + % look for the opening ( + for kk=plstart(1):length(rest) + if rest(kk) == '(' + plstart = kk; + break + end + end + % now look for the ending ) for this plist + nexp = 1; + kk=plstart+1; + while nexp~=0 + if rest(kk) == '(' + nexp = nexp + 1; + elseif rest(kk) == ')' + nexp = nexp - 1; + end + kk=kk+1; + end + plend = kk-1; + pl = ['plist' rest(plstart:plend)]; + rest = strrep(rest, pl, ''); + plstart = regexp(rest, 'plist\(', 'start'); + pls = [pls {pl}]; + end + + % input vars + invars = regexp(rest, '\((.*)\)', 'tokens'); + if ~isempty(invars) + invars = regexp(invars{1}, '\s*,\s*', 'split'); + invars = invars{1}; + for kk=1:numel(invars) + % remove leading [ and trailing ] + iv = strtrim(invars{kk}); + if ~isempty(iv) + if invars{kk}(1) == '[' && invars{kk}(end) == ']' + invars{kk} = invars{kk}(2:end-1); + end + else + invars{kk} = iv; + end + end + end + out.outvars = strtrim(outvars(cellfun(@(x) ~isempty(x),outvars))); + out.method = strtrim(method); + out.invars = strtrim(invars(cellfun(@(x) ~isempty(x),invars))); + out.pls = strtrim(pls(cellfun(@(x) ~isempty(x),pls))); + out.comment = strtrim(cmt); + +end