enable multi-line native matlab statements

issue#70
Houtan Bastani 2010-06-18 12:39:29 +02:00
parent 74b0b9c198
commit c0cc384956
3 changed files with 46 additions and 26 deletions

View File

@ -44,6 +44,7 @@ int comment_caller, line_caller;
this flag is set to 1, when command finished it is set to 0
*/
int sigma_e = 0;
string eofbuff;
%}
%option c++
@ -52,11 +53,12 @@ int sigma_e = 0;
%option case-insensitive noyywrap nounput batch debug never-interactive
/* NB: if new start conditions are defined, add them in the line for [\n]+ */
/* NB: if new start conditions are defined, add them in the line for [\n]+ and <<EOF>>*/
%x COMMENT
%x DYNARE_STATEMENT
%x DYNARE_BLOCK
%x NATIVE
%x NATIVE_COMMENT
%x LINE1
%x LINE2
%x LINE3
@ -569,29 +571,39 @@ int sigma_e = 0;
/* Add the native statement */
<NATIVE>{
[^/%*\n]* |
"*" |
"/" { yymore(); }
\n {
driver.add_native_remove_charset(yytext, "\n");
BEGIN INITIAL;
}
"%".* {
driver.add_native_remove_charset(yytext, "%");
BEGIN INITIAL;
}
"//".* {
driver.add_native_remove_charset(yytext, "//");
BEGIN INITIAL;
}
"/*" {
driver.add_native_remove_charset(yytext, "/*");
comment_caller = INITIAL;
BEGIN COMMENT;
}
[^/%*\n\.]* |
\.{1,2} |
"*" |
"/" { yymore(); eofbuff = string(yytext); }
\.{3,}[[:space:]]*\n { driver.add_native_remove_charset(yytext, "\n"); }
\n {
if (strlen(yytext) > 1)
driver.add_native_remove_charset(yytext, "\n");
BEGIN INITIAL;
}
<<EOF>> {
driver.add_native(eofbuff);
yyterminate();
}
\.{3,}[[:space:]]*"%".*\n |
"%"[^\n]* { driver.add_native_remove_charset(yytext, "%"); }
\.{3,}[[:space:]]*"//".*\n |
"//"[^\n]* { driver.add_native_remove_charset(yytext, "//"); }
\.{3,}[[:space:]]*"/*" {
driver.add_native_remove_charset(yytext, "/*");
BEGIN NATIVE_COMMENT;
}
"/*" {
driver.add_native_remove_charset(yytext, "/*");
comment_caller = NATIVE;
BEGIN COMMENT;
}
}
<*><<EOF>> { yyterminate(); }
<NATIVE_COMMENT>"*/"[[:space:]]*\n { BEGIN NATIVE; }
<NATIVE_COMMENT>.
<INITIAL,DYNARE_STATEMENT,DYNARE_BLOCK,COMMENT,LINE1,LINE2,LINE3,NATIVE_COMMENT><<EOF>> { yyterminate(); }
<*>. { driver.error(*yylloc, "character unrecognized by lexer"); }
%%

View File

@ -1840,14 +1840,20 @@ ParsingDriver::add_model_var_or_external_function(string *function_name, bool in
}
void
ParsingDriver::add_native_remove_charset(const char *s, const char *token)
ParsingDriver::add_native(const string &s)
{
mod_file->addStatement(new NativeStatement(s));
}
void
ParsingDriver::add_native_remove_charset(const char *s, const string &token)
{
string str = string(s);
string tok = string(token);
size_t found = str.find(token);
assert(found != string::npos);
mod_file->addStatement(new NativeStatement(str.substr(0, found)));
str.resize(found);
add_native(str);
}
void

View File

@ -489,8 +489,10 @@ public:
void add_external_function_arg(NodeID arg);
//! Adds an external function call node
NodeID add_model_var_or_external_function(string *function_name, bool in_model_block);
//! Adds a native statement
void add_native(const string &s);
//! Adds a native statement, first removing the set of characters passed in token (and everything after)
void add_native_remove_charset(const char *s, const char *token);
void add_native_remove_charset(const char *s, const string &token);
//! Resets data_tree and model_tree pointers to default (i.e. mod_file->expressions_tree)
void reset_data_tree();
//! Begin a steady_state_model block