X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Fvariable-parser.c;h=5c19b81e2f5bd8c477f80742464416b8a58f8fb2;hb=4ace3e978177b9f189ac8ebf8e852d5001dabcf5;hp=49d6a5deb900a6e63e8363b1fd020c685116f16c;hpb=2be9bee9da6a2ce27715e58128569594319abfa2;p=pspp diff --git a/src/language/lexer/variable-parser.c b/src/language/lexer/variable-parser.c index 49d6a5deb9..5c19b81e2f 100644 --- a/src/language/lexer/variable-parser.c +++ b/src/language/lexer/variable-parser.c @@ -37,6 +37,8 @@ #include "libpspp/str.h" #include "libpspp/stringi-set.h" +#include "math/interaction.h" + #include "gl/c-ctype.h" #include "gl/xalloc.h" @@ -873,3 +875,70 @@ var_set_create_from_array (struct variable *const *var, size_t var_cnt) return vs; } + +/* Match a variable. + If the match succeeds, the variable will be placed in VAR. + Returns true if successful */ +bool +lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const struct variable **var) +{ + if (lex_token (lexer) != T_ID) + return false; + + *var = parse_variable_const (lexer, dict); + + if ( *var == NULL) + return false; + return true; +} + +/* An interaction is a variable followed by {*, BY} followed by an interaction */ +static bool +parse_internal_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact, struct interaction **it) +{ + const struct variable *v = NULL; + assert (iact); + + switch (lex_next_token (lexer, 1)) + { + case T_ENDCMD: + case T_SLASH: + case T_COMMA: + case T_ID: + case T_BY: + case T_ASTERISK: + break; + default: + return false; + break; + } + + if (! lex_match_variable (lexer, dict, &v)) + { + if (it) + interaction_destroy (*it); + *iact = NULL; + return false; + } + + assert (v); + + if ( *iact == NULL) + *iact = interaction_create (v); + else + interaction_add_variable (*iact, v); + + if ( lex_match (lexer, T_ASTERISK) || lex_match (lexer, T_BY)) + { + return parse_internal_interaction (lexer, dict, iact, iact); + } + + return true; +} + +bool +parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact) +{ + return parse_internal_interaction (lexer, dict, iact, NULL); +} +