TITLE and SUBTITLE: Don't treat an unquoted argument as a quoted string.
[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([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([strings])
363 AT_KEYWORDS([scan])
364 AT_DATA([input], [dnl
365 'x' "y" 'abc'
366 'Don''t' "Can't" 'Won''t'
367 """quoted""" '"quoted"'
368 '' "" '''' """"
369 'missing end quote
370 "missing double quote
371 'x' + "y"
372 + 'z' +
373 'a' /* abc */ + "b" /*
374 + 'c' +/* */"d"/* */+'e'
375 'foo'
376 +          /* special case: + in column 0 would ordinarily start a new command
377 'bar'
378 'foo'
379  +
380 'bar'
381 'foo'
382 +
383
384 'bar'
385
386 +
387 x"4142"+'5152'
388 "4142"+
389 x'5152'
390 x"4142"
391 +u'304a'
392 "�あいうえお"
393 "abc"+U"FFFD"+u'3048'+"xyz"
394 ])
395 AT_DATA([expout-base], [dnl
396 STRING "x"
397 SKIP
398 STRING "y"
399 SKIP
400 STRING "abc"
401 SKIP
402 STRING "Don't"
403 SKIP
404 STRING "Can't"
405 SKIP
406 STRING "Won't"
407 SKIP
408 STRING ""quoted""
409 SKIP
410 STRING ""quoted""
411 SKIP
412 STRING ""
413 SKIP
414 STRING ""
415 SKIP
416 STRING "'"
417 SKIP
418 STRING """
419 SKIP
420 EXPECTED_QUOTE
421 SKIP
422 EXPECTED_QUOTE
423 SKIP
424 STRING "xyzabcde"
425 SKIP
426 STRING "foobar"
427 SKIP
428 STRING "foobar"
429 SKIP
430 STRING "foo"
431 SKIP
432 PLUS
433 SKIP
434 ENDCMD
435 SKIP
436 STRING "bar"
437 SKIP
438 ENDCMD
439 SKIP
440 PLUS
441 SKIP
442 STRING "AB5152"
443 SKIP
444 STRING "4142QR"
445 SKIP
446 STRING "ABお"
447 SKIP
448 STRING "�あいうえお"
449 SKIP
450 STRING "abc�えxyz"
451 -SKIP
452 STOP
453 ])
454 PSPP_CHECK_SCAN([-i])
455 AT_CLEANUP
456 \f
457 AT_SETUP([@%:@! construct])
458 AT_KEYWORDS([scan])
459 AT_DATA([input], [dnl
460 #! /usr/bin/pspp
461 #! /usr/bin/pspp
462 ])
463 AT_DATA([expout-base], [dnl
464 SKIP
465 SKIP
466 ID "#"
467 MACRO_ID "!"
468 SKIP
469 SLASH
470 ID "usr"
471 SLASH
472 ID "bin"
473 SLASH
474 ID "pspp"
475 -SKIP
476 STOP
477 ])
478 PSPP_CHECK_SCAN([-i])
479 AT_CLEANUP
480 \f
481 AT_SETUP([* and COMMENT commands])
482 AT_KEYWORDS([scan])
483 AT_DATA([input], [dnl
484 * Comment commands "don't
485 have to contain valid tokens.
486
487 ** Check ambiguity with ** token.
488 ****************.
489
490 comment keyword works too.
491 COMM also.
492 com is ambiguous with COMPUTE.
493
494    * Comment need not start at left margin.
495
496 * Comment ends with blank line
497
498 next command.
499
500 ])
501 AT_DATA([expout-base], [dnl
502 SKIP
503 SKIP
504 SKIP
505 ENDCMD
506 SKIP
507 ENDCMD
508 SKIP
509 SKIP
510 ENDCMD
511 SKIP
512 SKIP
513 ENDCMD
514 SKIP
515 ENDCMD
516 SKIP
517 SKIP
518 ENDCMD
519 SKIP
520 SKIP
521 ENDCMD
522 SKIP
523 ID "com"
524 SKIP
525 ID "is"
526 SKIP
527 ID "ambiguous"
528 SKIP
529 WITH
530 SKIP
531 ID "COMPUTE"
532 ENDCMD
533 SKIP
534 ENDCMD
535 SKIP
536 SKIP
537 SKIP
538 ENDCMD
539 SKIP
540 ENDCMD
541 SKIP
542 SKIP
543 SKIP
544 ENDCMD
545 SKIP
546 ID "next"
547 SKIP
548 ID "command"
549 ENDCMD
550 SKIP
551 -ENDCMD
552 -SKIP
553 STOP
554 ])
555 PSPP_CHECK_SCAN([-i])
556 AT_CLEANUP
557 \f
558 AT_SETUP([DOCUMENT command])
559 AT_KEYWORDS([scan])
560 AT_DATA([input], [dnl
561 DOCUMENT one line.
562 DOC more
563     than
564         one
565             line.
566 docu
567 first.paragraph
568 isn't parsed as tokens
569
570 second paragraph.
571 ])
572 AT_DATA([expout-base], [dnl
573 ID "DOCUMENT"
574 STRING "DOCUMENT one line."
575 ENDCMD
576 ENDCMD
577 SKIP
578 ID "DOCUMENT"
579 STRING "DOC more"
580 SKIP
581 STRING "    than"
582 SKIP
583 STRING "        one"
584 SKIP
585 STRING "            line."
586 ENDCMD
587 ENDCMD
588 SKIP
589 ID "DOCUMENT"
590 STRING "docu"
591 SKIP
592 STRING "first.paragraph"
593 SKIP
594 STRING "isn't parsed as tokens"
595 SKIP
596 STRING ""
597 SKIP
598 STRING "second paragraph."
599 -ENDCMD
600 -ENDCMD
601 -SKIP
602 STOP
603 ])
604 PSPP_CHECK_SCAN([-i])
605 AT_CLEANUP
606 \f
607 AT_SETUP([FILE LABEL commands])
608 AT_KEYWORDS([scan])
609 AT_DATA([input], [dnl
610 FIL label isn't quoted.
611 FILE
612   lab 'is quoted'.
613 FILE /*
614 /**/  lab not quoted here either
615
616 ])
617 AT_DATA([expout-base], [dnl
618 ID "FIL"
619 SKIP
620 ID "label"
621 SKIP
622 STRING "isn't quoted"
623 ENDCMD
624 SKIP
625 ID "FILE"
626 SKIP
627 SKIP
628 ID "lab"
629 SKIP
630 STRING "is quoted"
631 ENDCMD
632 SKIP
633 ID "FILE"
634 SKIP
635 SKIP
636 SKIP
637 SKIP
638 SKIP
639 ID "lab"
640 SKIP
641 STRING "not quoted here either"
642 SKIP
643 -ENDCMD
644 -SKIP
645 STOP
646 ])
647 PSPP_CHECK_SCAN([-i])
648 AT_CLEANUP
649 \f
650 AT_SETUP([BEGIN DATA command])
651 AT_KEYWORDS([scan])
652 AT_DATA([input], [dnl
653 begin data.
654 123
655 xxx
656 end data.
657
658 BEG /**/ DAT /*
659 5 6 7 /* x
660
661 end  data
662 end data
663 .
664 ])
665 AT_DATA([expout-base], [dnl
666 ID "begin"
667 SKIP
668 ID "data"
669 ENDCMD
670 SKIP
671 STRING "123"
672 SKIP
673 STRING "xxx"
674 SKIP
675 ID "end"
676 SKIP
677 ID "data"
678 ENDCMD
679 SKIP
680 ENDCMD
681 SKIP
682 ID "BEG"
683 SKIP
684 SKIP
685 SKIP
686 ID "DAT"
687 SKIP
688 SKIP
689 SKIP
690 STRING "5 6 7 /* x"
691 SKIP
692 STRING ""
693 SKIP
694 STRING "end  data"
695 SKIP
696 ID "end"
697 SKIP
698 ID "data"
699 SKIP
700 ENDCMD
701 -SKIP
702 STOP
703 ])
704 PSPP_CHECK_SCAN([-i])
705 AT_CLEANUP
706 \f
707 AT_SETUP([DO REPEAT command])
708 AT_KEYWORDS([scan])
709 AT_DATA([input], [dnl
710 do repeat x=a b c
711           y=d e f.
712   do repeat a=1 thru 5.
713 another command.
714 second command
715 + third command.
716 end /* x */ /* y */ repeat print.
717 end
718  repeat.
719 ])
720 AT_DATA([expout-base], [dnl
721 ID "do"
722 SKIP
723 ID "repeat"
724 SKIP
725 ID "x"
726 EQUALS
727 ID "a"
728 SKIP
729 ID "b"
730 SKIP
731 ID "c"
732 SKIP
733 SKIP
734 ID "y"
735 EQUALS
736 ID "d"
737 SKIP
738 ID "e"
739 SKIP
740 ID "f"
741 ENDCMD
742 SKIP
743 STRING "  do repeat a=1 thru 5."
744 SKIP
745 STRING "another command."
746 SKIP
747 STRING "second command"
748 SKIP
749 STRING "+ third command."
750 SKIP
751 STRING "end /* x */ /* y */ repeat print."
752 SKIP
753 ID "end"
754 SKIP
755 SKIP
756 ID "repeat"
757 ENDCMD
758 -SKIP
759 STOP
760 ])
761 PSPP_CHECK_SCAN([-i])
762 AT_CLEANUP
763 \f
764 AT_SETUP([DO REPEAT command in batch mode])
765 AT_KEYWORDS([scan])
766 AT_DATA([input], [dnl
767 do repeat x=a b c
768           y=d e f
769 do repeat a=1 thru 5
770 another command
771 second command
772 + third command
773 end /* x */ /* y */ repeat print
774 end
775  repeat
776 do
777   repeat #a=1
778
779   inner command
780 end repeat
781 ])
782 AT_DATA([expout-base], [dnl
783 ID "do"
784 SKIP
785 ID "repeat"
786 SKIP
787 ID "x"
788 EQUALS
789 ID "a"
790 SKIP
791 ID "b"
792 SKIP
793 ID "c"
794 SKIP
795 SKIP
796 ID "y"
797 EQUALS
798 ID "d"
799 SKIP
800 ID "e"
801 SKIP
802 ID "f"
803 SKIP
804 ENDCMD
805 STRING "do repeat a=1 thru 5"
806 SKIP
807 STRING "another command"
808 SKIP
809 STRING "second command"
810 SKIP
811 STRING "+ third command"
812 SKIP
813 STRING "end /* x */ /* y */ repeat print"
814 SKIP
815 ID "end"
816 SKIP
817 SKIP
818 ID "repeat"
819 SKIP
820 ENDCMD
821 ID "do"
822 SKIP
823 SKIP
824 ID "repeat"
825 SKIP
826 ID "#a"
827 EQUALS
828 POS_NUM 1
829 SKIP
830 ENDCMD
831 SKIP
832 STRING "  inner command"
833 SKIP
834 ID "end"
835 SKIP
836 ID "repeat"
837 -SKIP
838 STOP
839 ])
840 PSPP_CHECK_SCAN([-b])
841 AT_CLEANUP
842 \f
843 AT_SETUP([DEFINE command - simple])
844 AT_KEYWORDS([scan])
845 AT_DATA([input], [dnl
846 define !macro1()
847 var1 var2 var3
848 !enddefine.
849 ])
850 AT_DATA([expout-base], [dnl
851 ID "define"
852 SKIP
853 MACRO_ID "!macro1"
854 LPAREN
855 RPAREN
856 SKIP
857 SKIP
858 STRING "var1 var2 var3"
859 SKIP
860 MACRO_ID "!enddefine"
861 ENDCMD
862 -SKIP
863 STOP
864 ])
865 PSPP_CHECK_SCAN([-i])
866 AT_CLEANUP
867 \f
868 AT_SETUP([DEFINE command - no newline after parentheses])
869 AT_KEYWORDS([scan])
870 AT_DATA([input], [dnl
871 define !macro1() var1 var2 var3
872 !enddefine.
873 ])
874 AT_DATA([expout-base], [dnl
875 ID "define"
876 SKIP
877 MACRO_ID "!macro1"
878 LPAREN
879 RPAREN
880 STRING " var1 var2 var3"
881 SKIP
882 MACRO_ID "!enddefine"
883 ENDCMD
884 -SKIP
885 STOP
886 ])
887 PSPP_CHECK_SCAN([-i])
888 AT_CLEANUP
889 \f
890 AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
891 AT_KEYWORDS([scan ENDDEFINE])
892 AT_DATA([input], [dnl
893 define !macro1()
894 var1 var2 var3!enddefine.
895 ])
896 AT_DATA([expout-base], [dnl
897 ID "define"
898 SKIP
899 MACRO_ID "!macro1"
900 LPAREN
901 RPAREN
902 SKIP
903 SKIP
904 STRING "var1 var2 var3"
905 MACRO_ID "!enddefine"
906 ENDCMD
907 -SKIP
908 STOP
909 ])
910 PSPP_CHECK_SCAN([-i])
911 AT_CLEANUP
912 \f
913 AT_SETUP([DEFINE command - all on one line])
914 AT_KEYWORDS([scan])
915 AT_DATA([input], [dnl
916 define !macro1()var1 var2 var3!enddefine.
917 ])
918 AT_DATA([expout-base], [dnl
919 ID "define"
920 SKIP
921 MACRO_ID "!macro1"
922 LPAREN
923 RPAREN
924 STRING "var1 var2 var3"
925 MACRO_ID "!enddefine"
926 ENDCMD
927 -SKIP
928 STOP
929 ])
930 PSPP_CHECK_SCAN([-i])
931 AT_CLEANUP
932 \f
933 AT_SETUP([DEFINE command - empty])
934 AT_KEYWORDS([scan])
935 AT_DATA([input], [dnl
936 define !macro1()
937 !enddefine.
938 ])
939 AT_DATA([expout-base], [dnl
940 ID "define"
941 SKIP
942 MACRO_ID "!macro1"
943 LPAREN
944 RPAREN
945 SKIP
946 SKIP
947 MACRO_ID "!enddefine"
948 ENDCMD
949 -SKIP
950 STOP
951 ])
952 PSPP_CHECK_SCAN([-i])
953 AT_CLEANUP
954 \f
955 AT_SETUP([DEFINE command - blank lines])
956 AT_KEYWORDS([scan])
957 AT_DATA([input], [dnl
958 define !macro1()
959
960
961 !enddefine.
962 ])
963 AT_DATA([expout-base], [dnl
964 ID "define"
965 SKIP
966 MACRO_ID "!macro1"
967 LPAREN
968 RPAREN
969 SKIP
970 SKIP
971 STRING ""
972 SKIP
973 STRING ""
974 SKIP
975 MACRO_ID "!enddefine"
976 ENDCMD
977 -SKIP
978 STOP
979 ])
980 PSPP_CHECK_SCAN([-i])
981 AT_CLEANUP
982 \f
983 AT_SETUP([DEFINE command - arguments])
984 AT_KEYWORDS([scan])
985 AT_DATA([input], [dnl
986 define !macro1(a(), b(), c())
987 !enddefine.
988 ])
989 AT_DATA([expout-base], [dnl
990 ID "define"
991 SKIP
992 MACRO_ID "!macro1"
993 LPAREN
994 ID "a"
995 LPAREN
996 RPAREN
997 COMMA
998 SKIP
999 ID "b"
1000 LPAREN
1001 RPAREN
1002 COMMA
1003 SKIP
1004 ID "c"
1005 LPAREN
1006 RPAREN
1007 RPAREN
1008 SKIP
1009 SKIP
1010 MACRO_ID "!enddefine"
1011 ENDCMD
1012 -SKIP
1013 STOP
1014 ])
1015 PSPP_CHECK_SCAN([-i])
1016 AT_CLEANUP
1017 \f
1018 AT_SETUP([DEFINE command - multiline arguments])
1019 AT_KEYWORDS([scan])
1020 AT_DATA([input], [dnl
1021 define !macro1(
1022   a(), b(
1023   ),
1024   c()
1025 )
1026 !enddefine.
1027 ])
1028 AT_DATA([expout-base], [dnl
1029 ID "define"
1030 SKIP
1031 MACRO_ID "!macro1"
1032 LPAREN
1033 SKIP
1034 SKIP
1035 ID "a"
1036 LPAREN
1037 RPAREN
1038 COMMA
1039 SKIP
1040 ID "b"
1041 LPAREN
1042 SKIP
1043 SKIP
1044 RPAREN
1045 COMMA
1046 SKIP
1047 SKIP
1048 ID "c"
1049 LPAREN
1050 RPAREN
1051 SKIP
1052 RPAREN
1053 SKIP
1054 SKIP
1055 MACRO_ID "!enddefine"
1056 ENDCMD
1057 -SKIP
1058 STOP
1059 ])
1060 PSPP_CHECK_SCAN([-i])
1061 AT_CLEANUP
1062 \f
1063 AT_SETUP([DEFINE command - arguments start on second line])
1064 AT_KEYWORDS([scan])
1065 AT_DATA([input], [dnl
1066 define !macro1
1067 (x,y,z
1068 )
1069 content 1
1070 content 2
1071 !enddefine.
1072 ])
1073 AT_DATA([expout-base], [dnl
1074 ID "define"
1075 SKIP
1076 MACRO_ID "!macro1"
1077 SKIP
1078 LPAREN
1079 ID "x"
1080 COMMA
1081 ID "y"
1082 COMMA
1083 ID "z"
1084 SKIP
1085 RPAREN
1086 SKIP
1087 SKIP
1088 STRING "content 1"
1089 SKIP
1090 STRING "content 2"
1091 SKIP
1092 MACRO_ID "!enddefine"
1093 ENDCMD
1094 -SKIP
1095 STOP
1096 ])
1097 PSPP_CHECK_SCAN([-i])
1098 AT_CLEANUP
1099 \f
1100 AT_SETUP([DEFINE command - early end of command 1])
1101 AT_KEYWORDS([scan])
1102 AT_DATA([input], [dnl
1103 define !macro1.
1104 data list /x 1.
1105 ])
1106 AT_DATA([expout-base], [dnl
1107 ID "define"
1108 SKIP
1109 MACRO_ID "!macro1"
1110 ENDCMD
1111 SKIP
1112 ID "data"
1113 SKIP
1114 ID "list"
1115 SKIP
1116 SLASH
1117 ID "x"
1118 SKIP
1119 POS_NUM 1
1120 ENDCMD
1121 -SKIP
1122 STOP
1123 ])
1124 PSPP_CHECK_SCAN([-i])
1125 AT_CLEANUP
1126 \f
1127 AT_SETUP([DEFINE command - early end of command 2])
1128 AT_KEYWORDS([scan])
1129 AT_DATA([input], [dnl
1130 define !macro1
1131 x.
1132 data list /x 1.
1133 ])
1134 AT_DATA([expout-base], [dnl
1135 ID "define"
1136 SKIP
1137 MACRO_ID "!macro1"
1138 SKIP
1139 ID "x"
1140 ENDCMD
1141 SKIP
1142 ID "data"
1143 SKIP
1144 ID "list"
1145 SKIP
1146 SLASH
1147 ID "x"
1148 SKIP
1149 POS_NUM 1
1150 ENDCMD
1151 -SKIP
1152 STOP
1153 ])
1154 PSPP_CHECK_SCAN([-i])
1155 AT_CLEANUP
1156 \f
1157 AT_SETUP([DEFINE command - early end of command 3])
1158 AT_KEYWORDS([scan])
1159 AT_DATA([input], [dnl
1160 define !macro1(.
1161 x.
1162 data list /x 1.
1163 ])
1164 AT_DATA([expout-base], [dnl
1165 ID "define"
1166 SKIP
1167 MACRO_ID "!macro1"
1168 LPAREN
1169 ENDCMD
1170 SKIP
1171 ID "x"
1172 ENDCMD
1173 SKIP
1174 ID "data"
1175 SKIP
1176 ID "list"
1177 SKIP
1178 SLASH
1179 ID "x"
1180 SKIP
1181 POS_NUM 1
1182 ENDCMD
1183 -SKIP
1184 STOP
1185 ])
1186 PSPP_CHECK_SCAN([-i])
1187 AT_CLEANUP
1188 \f
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.
1194 define !macro1.
1195 data list /x 1.
1196 ])
1197 AT_DATA([expout-base], [dnl
1198 ID "define"
1199 SKIP
1200 MACRO_ID "!macro1"
1201 ENDCMD
1202 SKIP
1203 ID "data"
1204 SKIP
1205 ID "list"
1206 SKIP
1207 SLASH
1208 ID "x"
1209 SKIP
1210 POS_NUM 1
1211 ENDCMD
1212 -SKIP
1213 STOP
1214 ])
1215 PSPP_CHECK_SCAN([-i])
1216 AT_CLEANUP
1217 \f
1218 AT_SETUP([DEFINE command - missing !ENDDEFINE])
1219 AT_KEYWORDS([scan])
1220 AT_DATA([input], [dnl
1221 define !macro1()
1222 content line 1
1223 content line 2
1224 ])
1225 AT_DATA([expout-base], [dnl
1226 ID "define"
1227 SKIP
1228 MACRO_ID "!macro1"
1229 LPAREN
1230 RPAREN
1231 SKIP
1232 SKIP
1233 STRING "content line 1"
1234 SKIP
1235 STRING "content line 2"
1236 -SKIP
1237 STOP
1238 ])
1239 PSPP_CHECK_SCAN([-i])
1240 AT_CLEANUP
1241 \f
1242 AT_SETUP([batch mode])
1243 AT_KEYWORDS([scan])
1244 AT_DATA([input], [dnl
1245 first command
1246      another line of first command
1247 +  second command
1248 third command
1249
1250 fourth command.
1251    fifth command.
1252 ])
1253 AT_DATA([expout-base], [dnl
1254 ID "first"
1255 SKIP
1256 ID "command"
1257 SKIP
1258 SKIP
1259 ID "another"
1260 SKIP
1261 ID "line"
1262 SKIP
1263 ID "of"
1264 SKIP
1265 ID "first"
1266 SKIP
1267 ID "command"
1268 SKIP
1269 ENDCMD
1270 SKIP
1271 ID "second"
1272 SKIP
1273 ID "command"
1274 SKIP
1275 ENDCMD
1276 ID "third"
1277 SKIP
1278 ID "command"
1279 SKIP
1280 ENDCMD
1281 SKIP
1282 ID "fourth"
1283 SKIP
1284 ID "command"
1285 ENDCMD
1286 SKIP
1287 SKIP
1288 ID "fifth"
1289 SKIP
1290 ID "command"
1291 ENDCMD
1292 -SKIP
1293 STOP
1294 ])
1295 PSPP_CHECK_SCAN([-b])
1296 AT_CLEANUP