1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 dnl GNU General Public License for more details.
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
17 AT_BANNER([syntax scanning])
18 m4_define([PSPP_CHECK_SCAN],
19 [sed 's/^-//' < expout-base > expout
20 AT_CHECK([scan-test $1 input], [0], [expout])
22 sed '/^-/d' < expout-base > expout
23 AT_CHECK([scan-test -s $1 input], [0], [expout])])
25 AT_SETUP([identifiers])
28 a aB i5 $x @efg @@. !abcd #.# .x _z.
30 QRSTUV./* end of line comment */
31 QrStUv./* end of line comment */ @&t@
32 WXYZ. /* unterminated end of line comment
33 �. /* U+FFFD is not valid in an identifier
35 AT_DATA([expout-base], [dnl
88 AT_SETUP([reserved words])
91 and or not eq ge gt le lt ne all by to with
92 AND OR NOT EQ GE GT LE LT NE ALL BY TO WITH
93 andx orx notx eqx gex gtx lex ltx nex allx byx tox withx
96 AT_DATA([expout-base], [dnl
182 PSPP_CHECK_SCAN([-i])
185 AT_SETUP([punctuation])
187 AT_DATA([input], [dnl
188 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
189 ~&|=>=><=<~=<>(),-+*/[[]]**
192 AT_DATA([expout-base], [dnl
274 PSPP_CHECK_SCAN([-i])
277 AT_SETUP([positive numbers])
279 AT_DATA([input], [dnl
281 123. /* comment 1 */ /* comment 2 */
283 5e1 6E-1 7e+1 6E+01 6e-03
284 .3E1 .4e-1 .5E+1 .6e+01 .7E-03
285 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03
288 AT_DATA([expout-base], [dnl
349 EXPECTED_EXPONENT "1e"
353 EXPECTED_EXPONENT "1e+"
355 EXPECTED_EXPONENT "1e-"
359 PSPP_CHECK_SCAN([-i])
362 AT_SETUP([negative numbers])
364 AT_DATA([input-base], [dnl
366 -123. /* comment 1 */ /* comment 2 */
367 -.1 -0.1 -00.1 -00.10
368 -5e1 -6E-1 -7e+1 -6E+01 -6e-03
369 -.3E1 -.4e-1 -.5E+1 -.6e+01 -.7E-03
370 -1.23e1 -45.6E-1 -78.9e+1 -99.9E+01 -11.2e-03
372 -. -1e -e1 -1e+ -1e- -1.
374 AT_DATA([expout-base0], [dnl
445 EXPECTED_EXPONENT "-1e"
451 EXPECTED_EXPONENT "-1e+"
453 EXPECTED_EXPONENT "-1e-"
461 AS_BOX([without extra spaces])
463 sed '/^+/d' < expout-base0 > expout-base
464 PSPP_CHECK_SCAN([-i])
466 AS_BOX([with extra spaces])
467 sed 's/ -/ - /g' < input-base > input
468 sed 's/EXPONENT "-/EXPONENT "- /
469 s/^+//' < expout-base0 > expout-base
470 PSPP_CHECK_SCAN([-i])
475 AT_DATA([input], [dnl
477 'Don''t' "Can't" 'Won''t'
478 """quoted""" '"quoted"'
481 "missing double quote
484 'a' /* abc */ + "b" /*
485 + 'c' +/* */"d"/* */+'e'
487 + /* special case: + in column 0 would ordinarily start a new command
504 "abc"+U"FFFD"+u'3048'+"xyz"
506 AT_DATA([expout-base], [dnl
565 PSPP_CHECK_SCAN([-i])
568 AT_SETUP([@%:@! construct])
570 AT_DATA([input], [dnl
574 AT_DATA([expout-base], [dnl
589 PSPP_CHECK_SCAN([-i])
592 AT_SETUP([* and COMMENT commands])
594 AT_DATA([input], [dnl
595 * Comment commands "don't
596 have to contain valid tokens.
598 ** Check ambiguity with ** token.
601 comment keyword works too.
603 com is ambiguous with COMPUTE.
605 * Comment need not start at left margin.
607 * Comment ends with blank line
612 AT_DATA([expout-base], [dnl
666 PSPP_CHECK_SCAN([-i])
669 AT_SETUP([DOCUMENT command])
671 AT_DATA([input], [dnl
679 isn't parsed as tokens
683 AT_DATA([expout-base], [dnl
685 STRING "DOCUMENT one line."
703 STRING "first.paragraph"
705 STRING "isn't parsed as tokens"
709 STRING "second paragraph."
715 PSPP_CHECK_SCAN([-i])
718 AT_SETUP([FILE LABEL commands])
720 AT_DATA([input], [dnl
721 FIL label isn't quoted.
725 /**/ lab not quoted here either
728 AT_DATA([expout-base], [dnl
733 STRING "isn't quoted"
752 STRING "not quoted here either"
758 PSPP_CHECK_SCAN([-i])
761 AT_SETUP([BEGIN DATA command])
763 AT_DATA([input], [dnl
776 AT_DATA([expout-base], [dnl
815 PSPP_CHECK_SCAN([-i])
818 AT_SETUP([DO REPEAT command])
820 AT_DATA([input], [dnl
823 do repeat a=1 thru 5.
827 end /* x */ /* y */ repeat print.
831 AT_DATA([expout-base], [dnl
854 STRING " do repeat a=1 thru 5."
856 STRING "another command."
858 STRING "second command"
860 STRING "+ third command."
862 STRING "end /* x */ /* y */ repeat print."
872 PSPP_CHECK_SCAN([-i])
875 AT_SETUP([DO REPEAT command in batch mode])
877 AT_DATA([input], [dnl
884 end /* x */ /* y */ repeat print
893 AT_DATA([expout-base], [dnl
916 STRING "do repeat a=1 thru 5"
918 STRING "another command"
920 STRING "second command"
922 STRING "+ third command"
924 STRING "end /* x */ /* y */ repeat print"
943 STRING " inner command"
951 PSPP_CHECK_SCAN([-b])
954 AT_SETUP([DEFINE command - simple])
956 AT_DATA([input], [dnl
961 AT_DATA([expout-base], [dnl
969 STRING "var1 var2 var3"
971 MACRO_ID "!enddefine"
976 PSPP_CHECK_SCAN([-i])
979 AT_SETUP([DEFINE command - no newline after parentheses])
981 AT_DATA([input], [dnl
982 define !macro1() var1 var2 var3
985 AT_DATA([expout-base], [dnl
991 STRING " var1 var2 var3"
993 MACRO_ID "!enddefine"
998 PSPP_CHECK_SCAN([-i])
1001 AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
1002 AT_KEYWORDS([scan ENDDEFINE])
1003 AT_DATA([input], [dnl
1005 var1 var2 var3!enddefine.
1007 AT_DATA([expout-base], [dnl
1015 STRING "var1 var2 var3"
1016 MACRO_ID "!enddefine"
1021 PSPP_CHECK_SCAN([-i])
1024 AT_SETUP([DEFINE command - all on one line])
1026 AT_DATA([input], [dnl
1027 define !macro1()var1 var2 var3!enddefine.
1029 AT_DATA([expout-base], [dnl
1035 STRING "var1 var2 var3"
1036 MACRO_ID "!enddefine"
1041 PSPP_CHECK_SCAN([-i])
1044 AT_SETUP([DEFINE command - empty])
1046 AT_DATA([input], [dnl
1050 AT_DATA([expout-base], [dnl
1058 MACRO_ID "!enddefine"
1063 PSPP_CHECK_SCAN([-i])
1066 AT_SETUP([DEFINE command - blank lines])
1068 AT_DATA([input], [dnl
1074 AT_DATA([expout-base], [dnl
1086 MACRO_ID "!enddefine"
1091 PSPP_CHECK_SCAN([-i])
1094 AT_SETUP([DEFINE command - arguments])
1096 AT_DATA([input], [dnl
1097 define !macro1(a(), b(), c())
1100 AT_DATA([expout-base], [dnl
1121 MACRO_ID "!enddefine"
1126 PSPP_CHECK_SCAN([-i])
1129 AT_SETUP([DEFINE command - multiline arguments])
1131 AT_DATA([input], [dnl
1139 AT_DATA([expout-base], [dnl
1166 MACRO_ID "!enddefine"
1171 PSPP_CHECK_SCAN([-i])
1174 AT_SETUP([DEFINE command - arguments start on second line])
1176 AT_DATA([input], [dnl
1184 AT_DATA([expout-base], [dnl
1203 MACRO_ID "!enddefine"
1208 PSPP_CHECK_SCAN([-i])
1211 AT_SETUP([DEFINE command - early end of command 1])
1213 AT_DATA([input], [dnl
1217 AT_DATA([expout-base], [dnl
1235 PSPP_CHECK_SCAN([-i])
1238 AT_SETUP([DEFINE command - early end of command 2])
1240 AT_DATA([input], [dnl
1245 AT_DATA([expout-base], [dnl
1265 PSPP_CHECK_SCAN([-i])
1268 AT_SETUP([DEFINE command - early end of command 3])
1270 AT_DATA([input], [dnl
1275 AT_DATA([expout-base], [dnl
1297 PSPP_CHECK_SCAN([-i])
1300 AT_SETUP([DEFINE command - early end of command 4])
1301 AT_KEYWORDS([segment])
1302 AT_DATA([input], [dnl
1303 dnl Notice the command terminator at the end of the DEFINE command,
1304 dnl which should not be there and ends it early.
1308 AT_DATA([expout-base], [dnl
1326 PSPP_CHECK_SCAN([-i])
1329 AT_SETUP([DEFINE command - missing !ENDDEFINE])
1331 AT_DATA([input], [dnl
1336 AT_DATA([expout-base], [dnl
1344 STRING "content line 1"
1346 STRING "content line 2"
1350 PSPP_CHECK_SCAN([-i])
1353 AT_SETUP([batch mode])
1355 AT_DATA([input], [dnl
1357 another line of first command
1364 AT_DATA([expout-base], [dnl
1406 PSPP_CHECK_SCAN([-b])