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])
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])
364 AT_DATA([input], [dnl
366 'Don''t' "Can't" 'Won''t'
367 """quoted""" '"quoted"'
370 "missing double quote
373 'a' /* abc */ + "b" /*
374 + 'c' +/* */"d"/* */+'e'
376 + /* special case: + in column 0 would ordinarily start a new command
393 "abc"+U"FFFD"+u'3048'+"xyz"
395 AT_DATA([expout-base], [dnl
454 PSPP_CHECK_SCAN([-i])
457 AT_SETUP([@%:@! construct])
459 AT_DATA([input], [dnl
463 AT_DATA([expout-base], [dnl
478 PSPP_CHECK_SCAN([-i])
481 AT_SETUP([* and COMMENT commands])
483 AT_DATA([input], [dnl
484 * Comment commands "don't
485 have to contain valid tokens.
487 ** Check ambiguity with ** token.
490 comment keyword works too.
492 com is ambiguous with COMPUTE.
494 * Comment need not start at left margin.
496 * Comment ends with blank line
501 AT_DATA([expout-base], [dnl
555 PSPP_CHECK_SCAN([-i])
558 AT_SETUP([DOCUMENT command])
560 AT_DATA([input], [dnl
568 isn't parsed as tokens
572 AT_DATA([expout-base], [dnl
574 STRING "DOCUMENT one line."
592 STRING "first.paragraph"
594 STRING "isn't parsed as tokens"
598 STRING "second paragraph."
604 PSPP_CHECK_SCAN([-i])
607 AT_SETUP([FILE LABEL commands])
609 AT_DATA([input], [dnl
610 FIL label isn't quoted.
614 /**/ lab not quoted here either
617 AT_DATA([expout-base], [dnl
622 STRING "isn't quoted"
641 STRING "not quoted here either"
647 PSPP_CHECK_SCAN([-i])
650 AT_SETUP([BEGIN DATA command])
652 AT_DATA([input], [dnl
665 AT_DATA([expout-base], [dnl
704 PSPP_CHECK_SCAN([-i])
707 AT_SETUP([DO REPEAT command])
709 AT_DATA([input], [dnl
712 do repeat a=1 thru 5.
716 end /* x */ /* y */ repeat print.
720 AT_DATA([expout-base], [dnl
743 STRING " do repeat a=1 thru 5."
745 STRING "another command."
747 STRING "second command"
749 STRING "+ third command."
751 STRING "end /* x */ /* y */ repeat print."
761 PSPP_CHECK_SCAN([-i])
764 AT_SETUP([DO REPEAT command in batch mode])
766 AT_DATA([input], [dnl
773 end /* x */ /* y */ repeat print
782 AT_DATA([expout-base], [dnl
805 STRING "do repeat a=1 thru 5"
807 STRING "another command"
809 STRING "second command"
811 STRING "+ third command"
813 STRING "end /* x */ /* y */ repeat print"
832 STRING " inner command"
840 PSPP_CHECK_SCAN([-b])
843 AT_SETUP([DEFINE command - simple])
845 AT_DATA([input], [dnl
850 AT_DATA([expout-base], [dnl
858 STRING "var1 var2 var3"
860 MACRO_ID "!enddefine"
865 PSPP_CHECK_SCAN([-i])
868 AT_SETUP([DEFINE command - no newline after parentheses])
870 AT_DATA([input], [dnl
871 define !macro1() var1 var2 var3
874 AT_DATA([expout-base], [dnl
880 STRING " var1 var2 var3"
882 MACRO_ID "!enddefine"
887 PSPP_CHECK_SCAN([-i])
890 AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
891 AT_KEYWORDS([scan ENDDEFINE])
892 AT_DATA([input], [dnl
894 var1 var2 var3!enddefine.
896 AT_DATA([expout-base], [dnl
904 STRING "var1 var2 var3"
905 MACRO_ID "!enddefine"
910 PSPP_CHECK_SCAN([-i])
913 AT_SETUP([DEFINE command - all on one line])
915 AT_DATA([input], [dnl
916 define !macro1()var1 var2 var3!enddefine.
918 AT_DATA([expout-base], [dnl
924 STRING "var1 var2 var3"
925 MACRO_ID "!enddefine"
930 PSPP_CHECK_SCAN([-i])
933 AT_SETUP([DEFINE command - empty])
935 AT_DATA([input], [dnl
939 AT_DATA([expout-base], [dnl
947 MACRO_ID "!enddefine"
952 PSPP_CHECK_SCAN([-i])
955 AT_SETUP([DEFINE command - blank lines])
957 AT_DATA([input], [dnl
963 AT_DATA([expout-base], [dnl
975 MACRO_ID "!enddefine"
980 PSPP_CHECK_SCAN([-i])
983 AT_SETUP([DEFINE command - arguments])
985 AT_DATA([input], [dnl
986 define !macro1(a(), b(), c())
989 AT_DATA([expout-base], [dnl
1010 MACRO_ID "!enddefine"
1015 PSPP_CHECK_SCAN([-i])
1018 AT_SETUP([DEFINE command - multiline arguments])
1020 AT_DATA([input], [dnl
1028 AT_DATA([expout-base], [dnl
1055 MACRO_ID "!enddefine"
1060 PSPP_CHECK_SCAN([-i])
1063 AT_SETUP([DEFINE command - arguments start on second line])
1065 AT_DATA([input], [dnl
1073 AT_DATA([expout-base], [dnl
1092 MACRO_ID "!enddefine"
1097 PSPP_CHECK_SCAN([-i])
1100 AT_SETUP([DEFINE command - early end of command 1])
1102 AT_DATA([input], [dnl
1106 AT_DATA([expout-base], [dnl
1124 PSPP_CHECK_SCAN([-i])
1127 AT_SETUP([DEFINE command - early end of command 2])
1129 AT_DATA([input], [dnl
1134 AT_DATA([expout-base], [dnl
1154 PSPP_CHECK_SCAN([-i])
1157 AT_SETUP([DEFINE command - early end of command 3])
1159 AT_DATA([input], [dnl
1164 AT_DATA([expout-base], [dnl
1186 PSPP_CHECK_SCAN([-i])
1189 AT_SETUP([DEFINE command - early end of command 4])
1190 AT_KEYWORDS([segment])
1191 AT_DATA([input], [dnl
1192 dnl Notice the command terminator at the end of the DEFINE command,
1193 dnl which should not be there and ends it early.
1197 AT_DATA([expout-base], [dnl
1215 PSPP_CHECK_SCAN([-i])
1218 AT_SETUP([DEFINE command - missing !ENDDEFINE])
1220 AT_DATA([input], [dnl
1225 AT_DATA([expout-base], [dnl
1233 STRING "content line 1"
1235 STRING "content line 2"
1239 PSPP_CHECK_SCAN([-i])
1242 AT_SETUP([batch mode])
1244 AT_DATA([input], [dnl
1246 another line of first command
1253 AT_DATA([expout-base], [dnl
1295 PSPP_CHECK_SCAN([-b])