str: New function ss_swap().
[pspp] / tests / language / lexer / scan.at
1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
3 dnl
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.
8 dnl
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.
13 dnl
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/>.
16 dnl
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])
21
22    sed '/^-/d' < expout-base > expout
23    AT_CHECK([scan-test -s $1 input], [0], [expout])])
24 \f
25 AT_SETUP([identifiers])
26 AT_KEYWORDS([scan])
27 AT_DATA([input], [dnl
28 a aB i5 $x @efg @@. !abcd #.# .x _z.
29 abcd. abcd.
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
34 ])
35 AT_DATA([expout-base], [dnl
36 ID "a"
37 SKIP
38 ID "aB"
39 SKIP
40 ID "i5"
41 SKIP
42 ID "$x"
43 SKIP
44 ID "@efg"
45 SKIP
46 ID "@@."
47 SKIP
48 MACRO_ID "!abcd"
49 SKIP
50 ID "#.#"
51 SKIP
52 MACRO_PUNCT "."
53 ID "x"
54 SKIP
55 MACRO_PUNCT "_"
56 ID "z"
57 ENDCMD
58 SKIP
59 ID "abcd."
60 SKIP
61 ID "abcd"
62 ENDCMD
63 SKIP
64 ID "QRSTUV"
65 ENDCMD
66 SKIP
67 SKIP
68 ID "QrStUv"
69 ENDCMD
70 SKIP
71 SKIP
72 SKIP
73 ID "WXYZ"
74 ENDCMD
75 SKIP
76 SKIP
77 SKIP
78 UNEXPECTED_CHAR 65533
79 ENDCMD
80 SKIP
81 SKIP
82 -SKIP
83 STOP
84 ])
85 PSPP_CHECK_SCAN([-i])
86 AT_CLEANUP
87 \f
88 AT_SETUP([reserved words])
89 AT_KEYWORDS([scan])
90 AT_DATA([input], [dnl
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
94 and. with.
95 ])
96 AT_DATA([expout-base], [dnl
97 AND
98 SKIP
99 OR
100 SKIP
101 NOT
102 SKIP
103 EQ
104 SKIP
105 GE
106 SKIP
107 GT
108 SKIP
109 LE
110 SKIP
111 LT
112 SKIP
113 NE
114 SKIP
115 ALL
116 SKIP
117 BY
118 SKIP
119 TO
120 SKIP
121 WITH
122 SKIP
123 AND
124 SKIP
125 OR
126 SKIP
127 NOT
128 SKIP
129 EQ
130 SKIP
131 GE
132 SKIP
133 GT
134 SKIP
135 LE
136 SKIP
137 LT
138 SKIP
139 NE
140 SKIP
141 ALL
142 SKIP
143 BY
144 SKIP
145 TO
146 SKIP
147 WITH
148 SKIP
149 ID "andx"
150 SKIP
151 ID "orx"
152 SKIP
153 ID "notx"
154 SKIP
155 ID "eqx"
156 SKIP
157 ID "gex"
158 SKIP
159 ID "gtx"
160 SKIP
161 ID "lex"
162 SKIP
163 ID "ltx"
164 SKIP
165 ID "nex"
166 SKIP
167 ID "allx"
168 SKIP
169 ID "byx"
170 SKIP
171 ID "tox"
172 SKIP
173 ID "withx"
174 SKIP
175 ID "and."
176 SKIP
177 WITH
178 ENDCMD
179 -SKIP
180 STOP
181 ])
182 PSPP_CHECK_SCAN([-i])
183 AT_CLEANUP
184 \f
185 AT_SETUP([punctuation])
186 AT_KEYWORDS([scan])
187 AT_DATA([input], [dnl
188 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
189 ~&|=>=><=<~=<>(),-+*/[[]]**
190 % : ; ? _ ` { } ~
191 ])
192 AT_DATA([expout-base], [dnl
193 NOT
194 SKIP
195 AND
196 SKIP
197 OR
198 SKIP
199 EQUALS
200 SKIP
201 GE
202 SKIP
203 GT
204 SKIP
205 LE
206 SKIP
207 LT
208 SKIP
209 NE
210 SKIP
211 NE
212 SKIP
213 LPAREN
214 SKIP
215 RPAREN
216 SKIP
217 COMMA
218 SKIP
219 DASH
220 SKIP
221 PLUS
222 SKIP
223 ASTERISK
224 SKIP
225 SLASH
226 SKIP
227 LBRACK
228 SKIP
229 RBRACK
230 SKIP
231 EXP
232 SKIP
233 NOT
234 AND
235 OR
236 EQUALS
237 GE
238 GT
239 LE
240 LT
241 NE
242 NE
243 LPAREN
244 RPAREN
245 COMMA
246 DASH
247 PLUS
248 ASTERISK
249 SLASH
250 LBRACK
251 RBRACK
252 EXP
253 SKIP
254 MACRO_PUNCT "%"
255 SKIP
256 MACRO_PUNCT ":"
257 SKIP
258 MACRO_PUNCT ";"
259 SKIP
260 MACRO_PUNCT "?"
261 SKIP
262 MACRO_PUNCT "_"
263 SKIP
264 MACRO_PUNCT "`"
265 SKIP
266 MACRO_PUNCT "{"
267 SKIP
268 MACRO_PUNCT "}"
269 SKIP
270 NOT
271 -SKIP
272 STOP
273 ])
274 PSPP_CHECK_SCAN([-i])
275 AT_CLEANUP
276 \f
277 AT_SETUP([positive numbers])
278 AT_KEYWORDS([scan])
279 AT_DATA([input], [dnl
280 0 1 01 001. 1.
281 123. /* comment 1 */ /* comment 2 */
282 .1 0.1 00.1 00.10
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
286 . 1e e1 1e+ 1e-
287 ])
288 AT_DATA([expout-base], [dnl
289 POS_NUM
290 SKIP
291 POS_NUM 1
292 SKIP
293 POS_NUM 1
294 SKIP
295 POS_NUM 1
296 SKIP
297 POS_NUM 1
298 ENDCMD
299 SKIP
300 POS_NUM 123
301 ENDCMD
302 SKIP
303 SKIP
304 SKIP
305 SKIP
306 SKIP
307 ENDCMD
308 POS_NUM 1
309 SKIP
310 POS_NUM 0.1
311 SKIP
312 POS_NUM 0.1
313 SKIP
314 POS_NUM 0.1
315 SKIP
316 POS_NUM 50
317 SKIP
318 POS_NUM 0.6
319 SKIP
320 POS_NUM 70
321 SKIP
322 POS_NUM 60
323 SKIP
324 POS_NUM 0.006
325 SKIP
326 ENDCMD
327 POS_NUM 30
328 SKIP
329 POS_NUM 0.04
330 SKIP
331 POS_NUM 5
332 SKIP
333 POS_NUM 6
334 SKIP
335 POS_NUM 0.0007
336 SKIP
337 POS_NUM 12.3
338 SKIP
339 POS_NUM 4.56
340 SKIP
341 POS_NUM 789
342 SKIP
343 POS_NUM 999
344 SKIP
345 POS_NUM 0.0112
346 SKIP
347 ENDCMD
348 SKIP
349 EXPECTED_EXPONENT "1e"
350 SKIP
351 ID "e1"
352 SKIP
353 EXPECTED_EXPONENT "1e+"
354 SKIP
355 EXPECTED_EXPONENT "1e-"
356 -SKIP
357 STOP
358 ])
359 PSPP_CHECK_SCAN([-i])
360 AT_CLEANUP
361 \f
362 AT_SETUP([negative numbers])
363 AT_KEYWORDS([scan])
364 AT_DATA([input-base], [dnl
365  -0 -1 -01 -001. -1.
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
371  -/**/1
372  -. -1e -e1 -1e+ -1e- -1.
373 ])
374 AT_DATA([expout-base0], [dnl
375 SKIP
376 NEG_NUM
377 SKIP
378 NEG_NUM -1
379 SKIP
380 NEG_NUM -1
381 SKIP
382 NEG_NUM -1
383 SKIP
384 NEG_NUM -1
385 ENDCMD
386 SKIP
387 SKIP
388 NEG_NUM -123
389 ENDCMD
390 SKIP
391 SKIP
392 SKIP
393 SKIP
394 SKIP
395 SKIP
396 NEG_NUM -0.1
397 SKIP
398 NEG_NUM -0.1
399 SKIP
400 NEG_NUM -0.1
401 SKIP
402 NEG_NUM -0.1
403 SKIP
404 SKIP
405 NEG_NUM -50
406 SKIP
407 NEG_NUM -0.6
408 SKIP
409 NEG_NUM -70
410 SKIP
411 NEG_NUM -60
412 SKIP
413 NEG_NUM -0.006
414 SKIP
415 SKIP
416 NEG_NUM -3
417 SKIP
418 NEG_NUM -0.04
419 SKIP
420 NEG_NUM -5
421 SKIP
422 NEG_NUM -6
423 SKIP
424 NEG_NUM -0.0007
425 SKIP
426 SKIP
427 NEG_NUM -12.3
428 SKIP
429 NEG_NUM -4.56
430 SKIP
431 NEG_NUM -789
432 SKIP
433 NEG_NUM -999
434 SKIP
435 NEG_NUM -0.0112
436 SKIP
437 SKIP
438 NEG_NUM -1
439 SKIP
440 SKIP
441 DASH
442 +SKIP
443 MACRO_PUNCT "."
444 SKIP
445 EXPECTED_EXPONENT "-1e"
446 SKIP
447 DASH
448 +SKIP
449 ID "e1"
450 SKIP
451 EXPECTED_EXPONENT "-1e+"
452 SKIP
453 EXPECTED_EXPONENT "-1e-"
454 SKIP
455 NEG_NUM -1
456 ENDCMD
457 -SKIP
458 STOP
459 ])
460
461 AS_BOX([without extra spaces])
462 cp input-base input
463 sed '/^+/d' < expout-base0 > expout-base
464 PSPP_CHECK_SCAN([-i])
465
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])
471 AT_CLEANUP
472 \f
473 AT_SETUP([strings])
474 AT_KEYWORDS([scan])
475 AT_DATA([input], [dnl
476 'x' "y" 'abc'
477 'Don''t' "Can't" 'Won''t'
478 """quoted""" '"quoted"'
479 '' "" '''' """"
480 'missing end quote
481 "missing double quote
482 'x' + "y"
483 + 'z' +
484 'a' /* abc */ + "b" /*
485 + 'c' +/* */"d"/* */+'e'
486 'foo'
487 +          /* special case: + in column 0 would ordinarily start a new command
488 'bar'
489 'foo'
490  +
491 'bar'
492 'foo'
493 +
494
495 'bar'
496
497 +
498 x"4142"+'5152'
499 "4142"+
500 x'5152'
501 x"4142"
502 +u'304a'
503 "�あいうえお"
504 "abc"+U"FFFD"+u'3048'+"xyz"
505 ])
506 AT_DATA([expout-base], [dnl
507 STRING "x"
508 SKIP
509 STRING "y"
510 SKIP
511 STRING "abc"
512 SKIP
513 STRING "Don't"
514 SKIP
515 STRING "Can't"
516 SKIP
517 STRING "Won't"
518 SKIP
519 STRING ""quoted""
520 SKIP
521 STRING ""quoted""
522 SKIP
523 STRING ""
524 SKIP
525 STRING ""
526 SKIP
527 STRING "'"
528 SKIP
529 STRING """
530 SKIP
531 EXPECTED_QUOTE
532 SKIP
533 EXPECTED_QUOTE
534 SKIP
535 STRING "xyzabcde"
536 SKIP
537 STRING "foobar"
538 SKIP
539 STRING "foobar"
540 SKIP
541 STRING "foo"
542 SKIP
543 PLUS
544 SKIP
545 ENDCMD
546 SKIP
547 STRING "bar"
548 SKIP
549 ENDCMD
550 SKIP
551 PLUS
552 SKIP
553 STRING "AB5152"
554 SKIP
555 STRING "4142QR"
556 SKIP
557 STRING "ABお"
558 SKIP
559 STRING "�あいうえお"
560 SKIP
561 STRING "abc�えxyz"
562 -SKIP
563 STOP
564 ])
565 PSPP_CHECK_SCAN([-i])
566 AT_CLEANUP
567 \f
568 AT_SETUP([@%:@! construct])
569 AT_KEYWORDS([scan])
570 AT_DATA([input], [dnl
571 #! /usr/bin/pspp
572 #! /usr/bin/pspp
573 ])
574 AT_DATA([expout-base], [dnl
575 SKIP
576 SKIP
577 ID "#"
578 MACRO_ID "!"
579 SKIP
580 SLASH
581 ID "usr"
582 SLASH
583 ID "bin"
584 SLASH
585 ID "pspp"
586 -SKIP
587 STOP
588 ])
589 PSPP_CHECK_SCAN([-i])
590 AT_CLEANUP
591 \f
592 AT_SETUP([* and COMMENT commands])
593 AT_KEYWORDS([scan])
594 AT_DATA([input], [dnl
595 * Comment commands "don't
596 have to contain valid tokens.
597
598 ** Check ambiguity with ** token.
599 ****************.
600
601 comment keyword works too.
602 COMM also.
603 com is ambiguous with COMPUTE.
604
605    * Comment need not start at left margin.
606
607 * Comment ends with blank line
608
609 next command.
610
611 ])
612 AT_DATA([expout-base], [dnl
613 SKIP
614 SKIP
615 SKIP
616 ENDCMD
617 SKIP
618 ENDCMD
619 SKIP
620 SKIP
621 ENDCMD
622 SKIP
623 SKIP
624 ENDCMD
625 SKIP
626 ENDCMD
627 SKIP
628 SKIP
629 ENDCMD
630 SKIP
631 SKIP
632 ENDCMD
633 SKIP
634 ID "com"
635 SKIP
636 ID "is"
637 SKIP
638 ID "ambiguous"
639 SKIP
640 WITH
641 SKIP
642 ID "COMPUTE"
643 ENDCMD
644 SKIP
645 ENDCMD
646 SKIP
647 SKIP
648 SKIP
649 ENDCMD
650 SKIP
651 ENDCMD
652 SKIP
653 SKIP
654 SKIP
655 ENDCMD
656 SKIP
657 ID "next"
658 SKIP
659 ID "command"
660 ENDCMD
661 SKIP
662 -ENDCMD
663 -SKIP
664 STOP
665 ])
666 PSPP_CHECK_SCAN([-i])
667 AT_CLEANUP
668 \f
669 AT_SETUP([DOCUMENT command])
670 AT_KEYWORDS([scan])
671 AT_DATA([input], [dnl
672 DOCUMENT one line.
673 DOC more
674     than
675         one
676             line.
677 docu
678 first.paragraph
679 isn't parsed as tokens
680
681 second paragraph.
682 ])
683 AT_DATA([expout-base], [dnl
684 ID "DOCUMENT"
685 STRING "DOCUMENT one line."
686 ENDCMD
687 ENDCMD
688 SKIP
689 ID "DOCUMENT"
690 STRING "DOC more"
691 SKIP
692 STRING "    than"
693 SKIP
694 STRING "        one"
695 SKIP
696 STRING "            line."
697 ENDCMD
698 ENDCMD
699 SKIP
700 ID "DOCUMENT"
701 STRING "docu"
702 SKIP
703 STRING "first.paragraph"
704 SKIP
705 STRING "isn't parsed as tokens"
706 SKIP
707 STRING ""
708 SKIP
709 STRING "second paragraph."
710 -ENDCMD
711 -ENDCMD
712 -SKIP
713 STOP
714 ])
715 PSPP_CHECK_SCAN([-i])
716 AT_CLEANUP
717 \f
718 AT_SETUP([FILE LABEL commands])
719 AT_KEYWORDS([scan])
720 AT_DATA([input], [dnl
721 FIL label isn't quoted.
722 FILE
723   lab 'is quoted'.
724 FILE /*
725 /**/  lab not quoted here either
726
727 ])
728 AT_DATA([expout-base], [dnl
729 ID "FIL"
730 SKIP
731 ID "label"
732 SKIP
733 STRING "isn't quoted"
734 ENDCMD
735 SKIP
736 ID "FILE"
737 SKIP
738 SKIP
739 ID "lab"
740 SKIP
741 STRING "is quoted"
742 ENDCMD
743 SKIP
744 ID "FILE"
745 SKIP
746 SKIP
747 SKIP
748 SKIP
749 SKIP
750 ID "lab"
751 SKIP
752 STRING "not quoted here either"
753 SKIP
754 -ENDCMD
755 -SKIP
756 STOP
757 ])
758 PSPP_CHECK_SCAN([-i])
759 AT_CLEANUP
760 \f
761 AT_SETUP([BEGIN DATA command])
762 AT_KEYWORDS([scan])
763 AT_DATA([input], [dnl
764 begin data.
765 123
766 xxx
767 end data.
768
769 BEG /**/ DAT /*
770 5 6 7 /* x
771
772 end  data
773 end data
774 .
775 ])
776 AT_DATA([expout-base], [dnl
777 ID "begin"
778 SKIP
779 ID "data"
780 ENDCMD
781 SKIP
782 STRING "123"
783 SKIP
784 STRING "xxx"
785 SKIP
786 ID "end"
787 SKIP
788 ID "data"
789 ENDCMD
790 SKIP
791 ENDCMD
792 SKIP
793 ID "BEG"
794 SKIP
795 SKIP
796 SKIP
797 ID "DAT"
798 SKIP
799 SKIP
800 SKIP
801 STRING "5 6 7 /* x"
802 SKIP
803 STRING ""
804 SKIP
805 STRING "end  data"
806 SKIP
807 ID "end"
808 SKIP
809 ID "data"
810 SKIP
811 ENDCMD
812 -SKIP
813 STOP
814 ])
815 PSPP_CHECK_SCAN([-i])
816 AT_CLEANUP
817 \f
818 AT_SETUP([DO REPEAT command])
819 AT_KEYWORDS([scan])
820 AT_DATA([input], [dnl
821 do repeat x=a b c
822           y=d e f.
823   do repeat a=1 thru 5.
824 another command.
825 second command
826 + third command.
827 end /* x */ /* y */ repeat print.
828 end
829  repeat.
830 ])
831 AT_DATA([expout-base], [dnl
832 ID "do"
833 SKIP
834 ID "repeat"
835 SKIP
836 ID "x"
837 EQUALS
838 ID "a"
839 SKIP
840 ID "b"
841 SKIP
842 ID "c"
843 SKIP
844 SKIP
845 ID "y"
846 EQUALS
847 ID "d"
848 SKIP
849 ID "e"
850 SKIP
851 ID "f"
852 ENDCMD
853 SKIP
854 STRING "  do repeat a=1 thru 5."
855 SKIP
856 STRING "another command."
857 SKIP
858 STRING "second command"
859 SKIP
860 STRING "+ third command."
861 SKIP
862 STRING "end /* x */ /* y */ repeat print."
863 SKIP
864 ID "end"
865 SKIP
866 SKIP
867 ID "repeat"
868 ENDCMD
869 -SKIP
870 STOP
871 ])
872 PSPP_CHECK_SCAN([-i])
873 AT_CLEANUP
874 \f
875 AT_SETUP([DO REPEAT command in batch mode])
876 AT_KEYWORDS([scan])
877 AT_DATA([input], [dnl
878 do repeat x=a b c
879           y=d e f
880 do repeat a=1 thru 5
881 another command
882 second command
883 + third command
884 end /* x */ /* y */ repeat print
885 end
886  repeat
887 do
888   repeat #a=1
889
890   inner command
891 end repeat
892 ])
893 AT_DATA([expout-base], [dnl
894 ID "do"
895 SKIP
896 ID "repeat"
897 SKIP
898 ID "x"
899 EQUALS
900 ID "a"
901 SKIP
902 ID "b"
903 SKIP
904 ID "c"
905 SKIP
906 SKIP
907 ID "y"
908 EQUALS
909 ID "d"
910 SKIP
911 ID "e"
912 SKIP
913 ID "f"
914 SKIP
915 ENDCMD
916 STRING "do repeat a=1 thru 5"
917 SKIP
918 STRING "another command"
919 SKIP
920 STRING "second command"
921 SKIP
922 STRING "+ third command"
923 SKIP
924 STRING "end /* x */ /* y */ repeat print"
925 SKIP
926 ID "end"
927 SKIP
928 SKIP
929 ID "repeat"
930 SKIP
931 ENDCMD
932 ID "do"
933 SKIP
934 SKIP
935 ID "repeat"
936 SKIP
937 ID "#a"
938 EQUALS
939 POS_NUM 1
940 SKIP
941 ENDCMD
942 SKIP
943 STRING "  inner command"
944 SKIP
945 ID "end"
946 SKIP
947 ID "repeat"
948 -SKIP
949 STOP
950 ])
951 PSPP_CHECK_SCAN([-b])
952 AT_CLEANUP
953 \f
954 AT_SETUP([DEFINE command - simple])
955 AT_KEYWORDS([scan])
956 AT_DATA([input], [dnl
957 define !macro1()
958 var1 var2 var3
959 !enddefine.
960 ])
961 AT_DATA([expout-base], [dnl
962 ID "define"
963 SKIP
964 MACRO_ID "!macro1"
965 LPAREN
966 RPAREN
967 SKIP
968 SKIP
969 STRING "var1 var2 var3"
970 SKIP
971 MACRO_ID "!enddefine"
972 ENDCMD
973 -SKIP
974 STOP
975 ])
976 PSPP_CHECK_SCAN([-i])
977 AT_CLEANUP
978 \f
979 AT_SETUP([DEFINE command - no newline after parentheses])
980 AT_KEYWORDS([scan])
981 AT_DATA([input], [dnl
982 define !macro1() var1 var2 var3
983 !enddefine.
984 ])
985 AT_DATA([expout-base], [dnl
986 ID "define"
987 SKIP
988 MACRO_ID "!macro1"
989 LPAREN
990 RPAREN
991 STRING " var1 var2 var3"
992 SKIP
993 MACRO_ID "!enddefine"
994 ENDCMD
995 -SKIP
996 STOP
997 ])
998 PSPP_CHECK_SCAN([-i])
999 AT_CLEANUP
1000 \f
1001 AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
1002 AT_KEYWORDS([scan ENDDEFINE])
1003 AT_DATA([input], [dnl
1004 define !macro1()
1005 var1 var2 var3!enddefine.
1006 ])
1007 AT_DATA([expout-base], [dnl
1008 ID "define"
1009 SKIP
1010 MACRO_ID "!macro1"
1011 LPAREN
1012 RPAREN
1013 SKIP
1014 SKIP
1015 STRING "var1 var2 var3"
1016 MACRO_ID "!enddefine"
1017 ENDCMD
1018 -SKIP
1019 STOP
1020 ])
1021 PSPP_CHECK_SCAN([-i])
1022 AT_CLEANUP
1023 \f
1024 AT_SETUP([DEFINE command - all on one line])
1025 AT_KEYWORDS([scan])
1026 AT_DATA([input], [dnl
1027 define !macro1()var1 var2 var3!enddefine.
1028 ])
1029 AT_DATA([expout-base], [dnl
1030 ID "define"
1031 SKIP
1032 MACRO_ID "!macro1"
1033 LPAREN
1034 RPAREN
1035 STRING "var1 var2 var3"
1036 MACRO_ID "!enddefine"
1037 ENDCMD
1038 -SKIP
1039 STOP
1040 ])
1041 PSPP_CHECK_SCAN([-i])
1042 AT_CLEANUP
1043 \f
1044 AT_SETUP([DEFINE command - empty])
1045 AT_KEYWORDS([scan])
1046 AT_DATA([input], [dnl
1047 define !macro1()
1048 !enddefine.
1049 ])
1050 AT_DATA([expout-base], [dnl
1051 ID "define"
1052 SKIP
1053 MACRO_ID "!macro1"
1054 LPAREN
1055 RPAREN
1056 SKIP
1057 SKIP
1058 MACRO_ID "!enddefine"
1059 ENDCMD
1060 -SKIP
1061 STOP
1062 ])
1063 PSPP_CHECK_SCAN([-i])
1064 AT_CLEANUP
1065 \f
1066 AT_SETUP([DEFINE command - blank lines])
1067 AT_KEYWORDS([scan])
1068 AT_DATA([input], [dnl
1069 define !macro1()
1070
1071
1072 !enddefine.
1073 ])
1074 AT_DATA([expout-base], [dnl
1075 ID "define"
1076 SKIP
1077 MACRO_ID "!macro1"
1078 LPAREN
1079 RPAREN
1080 SKIP
1081 SKIP
1082 STRING ""
1083 SKIP
1084 STRING ""
1085 SKIP
1086 MACRO_ID "!enddefine"
1087 ENDCMD
1088 -SKIP
1089 STOP
1090 ])
1091 PSPP_CHECK_SCAN([-i])
1092 AT_CLEANUP
1093 \f
1094 AT_SETUP([DEFINE command - arguments])
1095 AT_KEYWORDS([scan])
1096 AT_DATA([input], [dnl
1097 define !macro1(a(), b(), c())
1098 !enddefine.
1099 ])
1100 AT_DATA([expout-base], [dnl
1101 ID "define"
1102 SKIP
1103 MACRO_ID "!macro1"
1104 LPAREN
1105 ID "a"
1106 LPAREN
1107 RPAREN
1108 COMMA
1109 SKIP
1110 ID "b"
1111 LPAREN
1112 RPAREN
1113 COMMA
1114 SKIP
1115 ID "c"
1116 LPAREN
1117 RPAREN
1118 RPAREN
1119 SKIP
1120 SKIP
1121 MACRO_ID "!enddefine"
1122 ENDCMD
1123 -SKIP
1124 STOP
1125 ])
1126 PSPP_CHECK_SCAN([-i])
1127 AT_CLEANUP
1128 \f
1129 AT_SETUP([DEFINE command - multiline arguments])
1130 AT_KEYWORDS([scan])
1131 AT_DATA([input], [dnl
1132 define !macro1(
1133   a(), b(
1134   ),
1135   c()
1136 )
1137 !enddefine.
1138 ])
1139 AT_DATA([expout-base], [dnl
1140 ID "define"
1141 SKIP
1142 MACRO_ID "!macro1"
1143 LPAREN
1144 SKIP
1145 SKIP
1146 ID "a"
1147 LPAREN
1148 RPAREN
1149 COMMA
1150 SKIP
1151 ID "b"
1152 LPAREN
1153 SKIP
1154 SKIP
1155 RPAREN
1156 COMMA
1157 SKIP
1158 SKIP
1159 ID "c"
1160 LPAREN
1161 RPAREN
1162 SKIP
1163 RPAREN
1164 SKIP
1165 SKIP
1166 MACRO_ID "!enddefine"
1167 ENDCMD
1168 -SKIP
1169 STOP
1170 ])
1171 PSPP_CHECK_SCAN([-i])
1172 AT_CLEANUP
1173 \f
1174 AT_SETUP([DEFINE command - arguments start on second line])
1175 AT_KEYWORDS([scan])
1176 AT_DATA([input], [dnl
1177 define !macro1
1178 (x,y,z
1179 )
1180 content 1
1181 content 2
1182 !enddefine.
1183 ])
1184 AT_DATA([expout-base], [dnl
1185 ID "define"
1186 SKIP
1187 MACRO_ID "!macro1"
1188 SKIP
1189 LPAREN
1190 ID "x"
1191 COMMA
1192 ID "y"
1193 COMMA
1194 ID "z"
1195 SKIP
1196 RPAREN
1197 SKIP
1198 SKIP
1199 STRING "content 1"
1200 SKIP
1201 STRING "content 2"
1202 SKIP
1203 MACRO_ID "!enddefine"
1204 ENDCMD
1205 -SKIP
1206 STOP
1207 ])
1208 PSPP_CHECK_SCAN([-i])
1209 AT_CLEANUP
1210 \f
1211 AT_SETUP([DEFINE command - early end of command 1])
1212 AT_KEYWORDS([scan])
1213 AT_DATA([input], [dnl
1214 define !macro1.
1215 data list /x 1.
1216 ])
1217 AT_DATA([expout-base], [dnl
1218 ID "define"
1219 SKIP
1220 MACRO_ID "!macro1"
1221 ENDCMD
1222 SKIP
1223 ID "data"
1224 SKIP
1225 ID "list"
1226 SKIP
1227 SLASH
1228 ID "x"
1229 SKIP
1230 POS_NUM 1
1231 ENDCMD
1232 -SKIP
1233 STOP
1234 ])
1235 PSPP_CHECK_SCAN([-i])
1236 AT_CLEANUP
1237 \f
1238 AT_SETUP([DEFINE command - early end of command 2])
1239 AT_KEYWORDS([scan])
1240 AT_DATA([input], [dnl
1241 define !macro1
1242 x.
1243 data list /x 1.
1244 ])
1245 AT_DATA([expout-base], [dnl
1246 ID "define"
1247 SKIP
1248 MACRO_ID "!macro1"
1249 SKIP
1250 ID "x"
1251 ENDCMD
1252 SKIP
1253 ID "data"
1254 SKIP
1255 ID "list"
1256 SKIP
1257 SLASH
1258 ID "x"
1259 SKIP
1260 POS_NUM 1
1261 ENDCMD
1262 -SKIP
1263 STOP
1264 ])
1265 PSPP_CHECK_SCAN([-i])
1266 AT_CLEANUP
1267 \f
1268 AT_SETUP([DEFINE command - early end of command 3])
1269 AT_KEYWORDS([scan])
1270 AT_DATA([input], [dnl
1271 define !macro1(.
1272 x.
1273 data list /x 1.
1274 ])
1275 AT_DATA([expout-base], [dnl
1276 ID "define"
1277 SKIP
1278 MACRO_ID "!macro1"
1279 LPAREN
1280 ENDCMD
1281 SKIP
1282 ID "x"
1283 ENDCMD
1284 SKIP
1285 ID "data"
1286 SKIP
1287 ID "list"
1288 SKIP
1289 SLASH
1290 ID "x"
1291 SKIP
1292 POS_NUM 1
1293 ENDCMD
1294 -SKIP
1295 STOP
1296 ])
1297 PSPP_CHECK_SCAN([-i])
1298 AT_CLEANUP
1299 \f
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.
1305 define !macro1.
1306 data list /x 1.
1307 ])
1308 AT_DATA([expout-base], [dnl
1309 ID "define"
1310 SKIP
1311 MACRO_ID "!macro1"
1312 ENDCMD
1313 SKIP
1314 ID "data"
1315 SKIP
1316 ID "list"
1317 SKIP
1318 SLASH
1319 ID "x"
1320 SKIP
1321 POS_NUM 1
1322 ENDCMD
1323 -SKIP
1324 STOP
1325 ])
1326 PSPP_CHECK_SCAN([-i])
1327 AT_CLEANUP
1328 \f
1329 AT_SETUP([DEFINE command - missing !ENDDEFINE])
1330 AT_KEYWORDS([scan])
1331 AT_DATA([input], [dnl
1332 define !macro1()
1333 content line 1
1334 content line 2
1335 ])
1336 AT_DATA([expout-base], [dnl
1337 ID "define"
1338 SKIP
1339 MACRO_ID "!macro1"
1340 LPAREN
1341 RPAREN
1342 SKIP
1343 SKIP
1344 STRING "content line 1"
1345 SKIP
1346 STRING "content line 2"
1347 -SKIP
1348 STOP
1349 ])
1350 PSPP_CHECK_SCAN([-i])
1351 AT_CLEANUP
1352 \f
1353 AT_SETUP([batch mode])
1354 AT_KEYWORDS([scan])
1355 AT_DATA([input], [dnl
1356 first command
1357      another line of first command
1358 +  second command
1359 third command
1360
1361 fourth command.
1362    fifth command.
1363 ])
1364 AT_DATA([expout-base], [dnl
1365 ID "first"
1366 SKIP
1367 ID "command"
1368 SKIP
1369 SKIP
1370 ID "another"
1371 SKIP
1372 ID "line"
1373 SKIP
1374 ID "of"
1375 SKIP
1376 ID "first"
1377 SKIP
1378 ID "command"
1379 SKIP
1380 ENDCMD
1381 SKIP
1382 ID "second"
1383 SKIP
1384 ID "command"
1385 SKIP
1386 ENDCMD
1387 ID "third"
1388 SKIP
1389 ID "command"
1390 SKIP
1391 ENDCMD
1392 SKIP
1393 ID "fourth"
1394 SKIP
1395 ID "command"
1396 ENDCMD
1397 SKIP
1398 SKIP
1399 ID "fifth"
1400 SKIP
1401 ID "command"
1402 ENDCMD
1403 -SKIP
1404 STOP
1405 ])
1406 PSPP_CHECK_SCAN([-b])
1407 AT_CLEANUP