lexer: Change the pipeline to allow more flexible use of macros.
[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 ID "aB"
38 ID "i5"
39 ID "$x"
40 ID "@efg"
41 ID "@@."
42 MACRO_ID "!abcd"
43 ID "#.#"
44 MACRO_PUNCT "."
45 ID "x"
46 MACRO_PUNCT "_"
47 ID "z"
48 ENDCMD
49 ID "abcd."
50 ID "abcd"
51 ENDCMD
52 ID "QRSTUV"
53 ENDCMD
54 ID "QrStUv"
55 ENDCMD
56 ID "WXYZ"
57 ENDCMD
58 STOP "Bad character U+FFFD in input."
59 ENDCMD
60 STOP
61 ])
62 PSPP_CHECK_SCAN([-i])
63 AT_CLEANUP
64 \f
65 AT_SETUP([reserved words])
66 AT_KEYWORDS([scan])
67 AT_DATA([input], [dnl
68 and or not eq ge gt le lt ne all by to with
69 AND OR NOT EQ GE GT LE LT NE ALL BY TO WITH
70 andx orx notx eqx gex gtx lex ltx nex allx byx tox withx
71 and. with.
72 ])
73 AT_DATA([expout-base], [dnl
74 AND
75 OR
76 NOT
77 EQ
78 GE
79 GT
80 LE
81 LT
82 NE
83 ALL
84 BY
85 TO
86 WITH
87 AND
88 OR
89 NOT
90 EQ
91 GE
92 GT
93 LE
94 LT
95 NE
96 ALL
97 BY
98 TO
99 WITH
100 ID "andx"
101 ID "orx"
102 ID "notx"
103 ID "eqx"
104 ID "gex"
105 ID "gtx"
106 ID "lex"
107 ID "ltx"
108 ID "nex"
109 ID "allx"
110 ID "byx"
111 ID "tox"
112 ID "withx"
113 ID "and."
114 WITH
115 ENDCMD
116 STOP
117 ])
118 PSPP_CHECK_SCAN([-i])
119 AT_CLEANUP
120 \f
121 AT_SETUP([punctuation])
122 AT_KEYWORDS([scan])
123 AT_DATA([input], [dnl
124 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
125 ~&|=>=><=<~=<>(),-+*/[[]]**
126 % : ; ? _ ` { } ~
127 ])
128 AT_DATA([expout-base], [dnl
129 NOT
130 AND
131 OR
132 EQUALS
133 GE
134 GT
135 LE
136 LT
137 NE
138 NE
139 LPAREN
140 RPAREN
141 COMMA
142 DASH
143 PLUS
144 ASTERISK
145 SLASH
146 LBRACK
147 RBRACK
148 EXP
149 NOT
150 AND
151 OR
152 EQUALS
153 GE
154 GT
155 LE
156 LT
157 NE
158 NE
159 LPAREN
160 RPAREN
161 COMMA
162 DASH
163 PLUS
164 ASTERISK
165 SLASH
166 LBRACK
167 RBRACK
168 EXP
169 MACRO_PUNCT "%"
170 MACRO_PUNCT ":"
171 MACRO_PUNCT ";"
172 MACRO_PUNCT "?"
173 MACRO_PUNCT "_"
174 MACRO_PUNCT "`"
175 MACRO_PUNCT "{"
176 MACRO_PUNCT "}"
177 NOT
178 STOP
179 ])
180 PSPP_CHECK_SCAN([-i])
181 AT_CLEANUP
182 \f
183 AT_SETUP([positive numbers])
184 AT_KEYWORDS([scan])
185 AT_DATA([input], [dnl
186 0 1 01 001. 1.
187 123. /* comment 1 */ /* comment 2 */
188 .1 0.1 00.1 00.10
189 5e1 6E-1 7e+1 6E+01 6e-03
190 .3E1 .4e-1 .5E+1 .6e+01 .7E-03
191 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03
192 . 1e e1 1e+ 1e-
193 ])
194 AT_DATA([expout-base], [dnl
195 POS_NUM
196 POS_NUM 1
197 POS_NUM 1
198 POS_NUM 1
199 POS_NUM 1
200 ENDCMD
201 POS_NUM 123
202 ENDCMD
203 ENDCMD
204 POS_NUM 1
205 POS_NUM 0.1
206 POS_NUM 0.1
207 POS_NUM 0.1
208 POS_NUM 50
209 POS_NUM 0.6
210 POS_NUM 70
211 POS_NUM 60
212 POS_NUM 0.006
213 ENDCMD
214 POS_NUM 30
215 POS_NUM 0.04
216 POS_NUM 5
217 POS_NUM 6
218 POS_NUM 0.0007
219 POS_NUM 12.3
220 POS_NUM 4.56
221 POS_NUM 789
222 POS_NUM 999
223 POS_NUM 0.0112
224 ENDCMD
225 STOP "Missing exponent following `1e'."
226 ID "e1"
227 STOP "Missing exponent following `1e+'."
228 STOP "Missing exponent following `1e-'."
229 STOP
230 ])
231 PSPP_CHECK_SCAN([-i])
232 AT_CLEANUP
233 \f
234 AT_SETUP([negative numbers])
235 AT_KEYWORDS([scan])
236 AT_DATA([input-base], [dnl
237  -0 -1 -01 -001. -1.
238  -123. /* comment 1 */ /* comment 2 */
239  -.1 -0.1 -00.1 -00.10
240  -5e1 -6E-1 -7e+1 -6E+01 -6e-03
241  -.3E1 -.4e-1 -.5E+1 -.6e+01 -.7E-03
242  -1.23e1 -45.6E-1 -78.9e+1 -99.9E+01 -11.2e-03
243  -/**/1
244  -. -1e -e1 -1e+ -1e- -1.
245 ])
246 AT_DATA([expout-base0], [dnl
247 NEG_NUM
248 NEG_NUM -1
249 NEG_NUM -1
250 NEG_NUM -1
251 NEG_NUM -1
252 ENDCMD
253 NEG_NUM -123
254 ENDCMD
255 NEG_NUM -0.1
256 NEG_NUM -0.1
257 NEG_NUM -0.1
258 NEG_NUM -0.1
259 NEG_NUM -50
260 NEG_NUM -0.6
261 NEG_NUM -70
262 NEG_NUM -60
263 NEG_NUM -0.006
264 NEG_NUM -3
265 NEG_NUM -0.04
266 NEG_NUM -5
267 NEG_NUM -6
268 NEG_NUM -0.0007
269 NEG_NUM -12.3
270 NEG_NUM -4.56
271 NEG_NUM -789
272 NEG_NUM -999
273 NEG_NUM -0.0112
274 NEG_NUM -1
275 DASH
276 MACRO_PUNCT "."
277 STOP "Missing exponent following `-1e'."
278 DASH
279 ID "e1"
280 STOP "Missing exponent following `-1e+'."
281 STOP "Missing exponent following `-1e-'."
282 NEG_NUM -1
283 ENDCMD
284 STOP
285 ])
286
287 cp input-base input
288 cp expout-base0 expout-base
289 PSPP_CHECK_SCAN([-i])
290
291 sed 's/ -/ - /g' < input-base > input
292 sed 's/following `-/following `- /' < expout-base0 > expout-base
293 PSPP_CHECK_SCAN([-i])
294 AT_CLEANUP
295 \f
296 AT_SETUP([strings])
297 AT_KEYWORDS([scan])
298 AT_DATA([input], [dnl
299 'x' "y" 'abc'
300 'Don''t' "Can't" 'Won''t'
301 """quoted""" '"quoted"'
302 '' "" '''' """"
303 'missing end quote
304 "missing double quote
305 'x' + "y"
306 + 'z' +
307 'a' /* abc */ + "b" /*
308 + 'c' +/* */"d"/* */+'e'
309 'foo'
310 +          /* special case: + in column 0 would ordinarily start a new command
311 'bar'
312 'foo'
313  +
314 'bar'
315 'foo'
316 +
317
318 'bar'
319
320 +
321 x"4142"+'5152'
322 "4142"+
323 x'5152'
324 x"4142"
325 +u'304a'
326 "�あいうえお"
327 "abc"+U"FFFD"+u'3048'+"xyz"
328 ])
329 AT_DATA([expout-base], [dnl
330 STRING "x"
331 STRING "y"
332 STRING "abc"
333 STRING "Don't"
334 STRING "Can't"
335 STRING "Won't"
336 STRING ""quoted""
337 STRING ""quoted""
338 STRING ""
339 STRING ""
340 STRING "'"
341 STRING """
342 STOP "Unterminated string constant."
343 STOP "Unterminated string constant."
344 STRING "xyzabcde"
345 STRING "foobar"
346 STRING "foobar"
347 STRING "foo"
348 PLUS
349 ENDCMD
350 STRING "bar"
351 ENDCMD
352 PLUS
353 STRING "AB5152"
354 STRING "4142QR"
355 STRING "ABお"
356 STRING "�あいうえお"
357 STRING "abc�えxyz"
358 STOP
359 ])
360 PSPP_CHECK_SCAN([-i])
361 AT_CLEANUP
362 \f
363 AT_SETUP([@%:@! construct])
364 AT_KEYWORDS([scan])
365 AT_DATA([input], [dnl
366 #! /usr/bin/pspp
367 #! /usr/bin/pspp
368 ])
369 AT_DATA([expout-base], [dnl
370 ID "#"
371 MACRO_ID "!"
372 SLASH
373 ID "usr"
374 SLASH
375 ID "bin"
376 SLASH
377 ID "pspp"
378 STOP
379 ])
380 PSPP_CHECK_SCAN([-i])
381 AT_CLEANUP
382 \f
383 AT_SETUP([* and COMMENT commands])
384 AT_KEYWORDS([scan])
385 AT_DATA([input], [dnl
386 * Comment commands "don't
387 have to contain valid tokens.
388
389 ** Check ambiguity with ** token.
390 ****************.
391
392 comment keyword works too.
393 COMM also.
394 com is ambiguous with COMPUTE.
395
396    * Comment need not start at left margin.
397
398 * Comment ends with blank line
399
400 next command.
401
402 ])
403 AT_DATA([expout-base], [dnl
404 ENDCMD
405 ENDCMD
406 ENDCMD
407 ENDCMD
408 ENDCMD
409 ENDCMD
410 ENDCMD
411 ID "com"
412 ID "is"
413 ID "ambiguous"
414 WITH
415 ID "COMPUTE"
416 ENDCMD
417 ENDCMD
418 ENDCMD
419 ENDCMD
420 ENDCMD
421 ID "next"
422 ID "command"
423 ENDCMD
424 -ENDCMD
425 STOP
426 ])
427 PSPP_CHECK_SCAN([-i])
428 AT_CLEANUP
429 \f
430 AT_SETUP([DOCUMENT command])
431 AT_KEYWORDS([scan])
432 AT_DATA([input], [dnl
433 DOCUMENT one line.
434 DOC more
435     than
436         one
437             line.
438 docu
439 first.paragraph
440 isn't parsed as tokens
441
442 second paragraph.
443 ])
444 AT_DATA([expout-base], [dnl
445 ID "DOCUMENT"
446 STRING "DOCUMENT one line."
447 ENDCMD
448 ENDCMD
449 ID "DOCUMENT"
450 STRING "DOC more"
451 STRING "    than"
452 STRING "        one"
453 STRING "            line."
454 ENDCMD
455 ENDCMD
456 ID "DOCUMENT"
457 STRING "docu"
458 STRING "first.paragraph"
459 STRING "isn't parsed as tokens"
460 STRING ""
461 STRING "second paragraph."
462 -ENDCMD
463 -ENDCMD
464 STOP
465 ])
466 PSPP_CHECK_SCAN([-i])
467 AT_CLEANUP
468 \f
469 AT_SETUP([FILE LABEL commands])
470 AT_KEYWORDS([scan])
471 AT_DATA([input], [dnl
472 FIL label isn't quoted.
473 FILE
474   lab 'is quoted'.
475 FILE /*
476 /**/  lab not quoted here either
477
478 ])
479 AT_DATA([expout-base], [dnl
480 ID "FIL"
481 ID "label"
482 STRING "isn't quoted"
483 ENDCMD
484 ID "FILE"
485 ID "lab"
486 STRING "is quoted"
487 ENDCMD
488 ID "FILE"
489 ID "lab"
490 STRING "not quoted here either"
491 -ENDCMD
492 STOP
493 ])
494 PSPP_CHECK_SCAN([-i])
495 AT_CLEANUP
496 \f
497 AT_SETUP([BEGIN DATA command])
498 AT_KEYWORDS([scan])
499 AT_DATA([input], [dnl
500 begin data.
501 123
502 xxx
503 end data.
504
505 BEG /**/ DAT /*
506 5 6 7 /* x
507
508 end  data
509 end data
510 .
511 ])
512 AT_DATA([expout-base], [dnl
513 ID "begin"
514 ID "data"
515 ENDCMD
516 STRING "123"
517 STRING "xxx"
518 ID "end"
519 ID "data"
520 ENDCMD
521 ENDCMD
522 ID "BEG"
523 ID "DAT"
524 STRING "5 6 7 /* x"
525 STRING ""
526 STRING "end  data"
527 ID "end"
528 ID "data"
529 ENDCMD
530 STOP
531 ])
532 PSPP_CHECK_SCAN([-i])
533 AT_CLEANUP
534 \f
535 AT_SETUP([DO REPEAT command])
536 AT_KEYWORDS([scan])
537 AT_DATA([input], [dnl
538 do repeat x=a b c
539           y=d e f.
540   do repeat a=1 thru 5.
541 another command.
542 second command
543 + third command.
544 end /* x */ /* y */ repeat print.
545 end
546  repeat.
547 ])
548 AT_DATA([expout-base], [dnl
549 ID "do"
550 ID "repeat"
551 ID "x"
552 EQUALS
553 ID "a"
554 ID "b"
555 ID "c"
556 ID "y"
557 EQUALS
558 ID "d"
559 ID "e"
560 ID "f"
561 ENDCMD
562 STRING "  do repeat a=1 thru 5."
563 STRING "another command."
564 STRING "second command"
565 STRING "+ third command."
566 STRING "end /* x */ /* y */ repeat print."
567 ID "end"
568 ID "repeat"
569 ENDCMD
570 STOP
571 ])
572 PSPP_CHECK_SCAN([-i])
573 AT_CLEANUP
574 \f
575 AT_SETUP([DO REPEAT command in batch mode])
576 AT_KEYWORDS([scan])
577 AT_DATA([input], [dnl
578 do repeat x=a b c
579           y=d e f
580 do repeat a=1 thru 5
581 another command
582 second command
583 + third command
584 end /* x */ /* y */ repeat print
585 end
586  repeat
587 do
588   repeat #a=1
589
590   inner command
591 end repeat
592 ])
593 AT_DATA([expout-base], [dnl
594 ID "do"
595 ID "repeat"
596 ID "x"
597 EQUALS
598 ID "a"
599 ID "b"
600 ID "c"
601 ID "y"
602 EQUALS
603 ID "d"
604 ID "e"
605 ID "f"
606 ENDCMD
607 STRING "do repeat a=1 thru 5"
608 STRING "another command"
609 STRING "second command"
610 STRING "+ third command"
611 STRING "end /* x */ /* y */ repeat print"
612 ID "end"
613 ID "repeat"
614 ENDCMD
615 ID "do"
616 ID "repeat"
617 ID "#a"
618 EQUALS
619 POS_NUM 1
620 ENDCMD
621 STRING "  inner command"
622 ID "end"
623 ID "repeat"
624 STOP
625 ])
626 PSPP_CHECK_SCAN([-b])
627 AT_CLEANUP
628 \f
629 AT_SETUP([DEFINE command - simple])
630 AT_KEYWORDS([scan])
631 AT_DATA([input], [dnl
632 define !macro1()
633 var1 var2 var3
634 !enddefine.
635 ])
636 AT_DATA([expout-base], [dnl
637 ID "define"
638 MACRO_ID "!macro1"
639 LPAREN
640 RPAREN
641 STRING "var1 var2 var3"
642 MACRO_ID "!enddefine"
643 ENDCMD
644 STOP
645 ])
646 PSPP_CHECK_SCAN([-i])
647 AT_CLEANUP
648 \f
649 AT_SETUP([DEFINE command - no newline after parentheses])
650 AT_KEYWORDS([scan])
651 AT_DATA([input], [dnl
652 define !macro1() var1 var2 var3
653 !enddefine.
654 ])
655 AT_DATA([expout-base], [dnl
656 ID "define"
657 MACRO_ID "!macro1"
658 LPAREN
659 RPAREN
660 STRING " var1 var2 var3"
661 MACRO_ID "!enddefine"
662 ENDCMD
663 STOP
664 ])
665 PSPP_CHECK_SCAN([-i])
666 AT_CLEANUP
667 \f
668 AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
669 AT_KEYWORDS([scan ENDDEFINE])
670 AT_DATA([input], [dnl
671 define !macro1()
672 var1 var2 var3!enddefine.
673 ])
674 AT_DATA([expout-base], [dnl
675 ID "define"
676 MACRO_ID "!macro1"
677 LPAREN
678 RPAREN
679 STRING "var1 var2 var3"
680 MACRO_ID "!enddefine"
681 ENDCMD
682 STOP
683 ])
684 PSPP_CHECK_SCAN([-i])
685 AT_CLEANUP
686 \f
687 AT_SETUP([DEFINE command - all on one line])
688 AT_KEYWORDS([scan])
689 AT_DATA([input], [dnl
690 define !macro1()var1 var2 var3!enddefine.
691 ])
692 AT_DATA([expout-base], [dnl
693 ID "define"
694 MACRO_ID "!macro1"
695 LPAREN
696 RPAREN
697 STRING "var1 var2 var3"
698 MACRO_ID "!enddefine"
699 ENDCMD
700 STOP
701 ])
702 PSPP_CHECK_SCAN([-i])
703 AT_CLEANUP
704 \f
705 AT_SETUP([DEFINE command - empty])
706 AT_KEYWORDS([scan])
707 AT_DATA([input], [dnl
708 define !macro1()
709 !enddefine.
710 ])
711 AT_DATA([expout-base], [dnl
712 ID "define"
713 MACRO_ID "!macro1"
714 LPAREN
715 RPAREN
716 MACRO_ID "!enddefine"
717 ENDCMD
718 STOP
719 ])
720 PSPP_CHECK_SCAN([-i])
721 AT_CLEANUP
722 \f
723 AT_SETUP([DEFINE command - blank lines])
724 AT_KEYWORDS([scan])
725 AT_DATA([input], [dnl
726 define !macro1()
727
728
729 !enddefine.
730 ])
731 AT_DATA([expout-base], [dnl
732 ID "define"
733 MACRO_ID "!macro1"
734 LPAREN
735 RPAREN
736 STRING ""
737 STRING ""
738 MACRO_ID "!enddefine"
739 ENDCMD
740 STOP
741 ])
742 PSPP_CHECK_SCAN([-i])
743 AT_CLEANUP
744 \f
745 AT_SETUP([DEFINE command - arguments])
746 AT_KEYWORDS([scan])
747 AT_DATA([input], [dnl
748 define !macro1(a(), b(), c())
749 !enddefine.
750 ])
751 AT_DATA([expout-base], [dnl
752 ID "define"
753 MACRO_ID "!macro1"
754 LPAREN
755 ID "a"
756 LPAREN
757 RPAREN
758 COMMA
759 ID "b"
760 LPAREN
761 RPAREN
762 COMMA
763 ID "c"
764 LPAREN
765 RPAREN
766 RPAREN
767 MACRO_ID "!enddefine"
768 ENDCMD
769 STOP
770 ])
771 PSPP_CHECK_SCAN([-i])
772 AT_CLEANUP
773 \f
774 AT_SETUP([DEFINE command - multiline arguments])
775 AT_KEYWORDS([scan])
776 AT_DATA([input], [dnl
777 define !macro1(
778   a(), b(
779   ),
780   c()
781 )
782 !enddefine.
783 ])
784 AT_DATA([expout-base], [dnl
785 ID "define"
786 MACRO_ID "!macro1"
787 LPAREN
788 ID "a"
789 LPAREN
790 RPAREN
791 COMMA
792 ID "b"
793 LPAREN
794 RPAREN
795 COMMA
796 ID "c"
797 LPAREN
798 RPAREN
799 RPAREN
800 MACRO_ID "!enddefine"
801 ENDCMD
802 STOP
803 ])
804 PSPP_CHECK_SCAN([-i])
805 AT_CLEANUP
806 \f
807 AT_SETUP([DEFINE command - arguments start on second line])
808 AT_KEYWORDS([scan])
809 AT_DATA([input], [dnl
810 define !macro1
811 (x,y,z
812 )
813 content 1
814 content 2
815 !enddefine.
816 ])
817 AT_DATA([expout-base], [dnl
818 ID "define"
819 MACRO_ID "!macro1"
820 LPAREN
821 ID "x"
822 COMMA
823 ID "y"
824 COMMA
825 ID "z"
826 RPAREN
827 STRING "content 1"
828 STRING "content 2"
829 MACRO_ID "!enddefine"
830 ENDCMD
831 STOP
832 ])
833 PSPP_CHECK_SCAN([-i])
834 AT_CLEANUP
835 \f
836 AT_SETUP([DEFINE command - early end of command 1])
837 AT_KEYWORDS([scan])
838 AT_DATA([input], [dnl
839 define !macro1.
840 data list /x 1.
841 ])
842 AT_DATA([expout-base], [dnl
843 ID "define"
844 MACRO_ID "!macro1"
845 ENDCMD
846 ID "data"
847 ID "list"
848 SLASH
849 ID "x"
850 POS_NUM 1
851 ENDCMD
852 STOP
853 ])
854 PSPP_CHECK_SCAN([-i])
855 AT_CLEANUP
856 \f
857 AT_SETUP([DEFINE command - early end of command 2])
858 AT_KEYWORDS([scan])
859 AT_DATA([input], [dnl
860 define !macro1
861 x.
862 data list /x 1.
863 ])
864 AT_DATA([expout-base], [dnl
865 ID "define"
866 MACRO_ID "!macro1"
867 ID "x"
868 ENDCMD
869 ID "data"
870 ID "list"
871 SLASH
872 ID "x"
873 POS_NUM 1
874 ENDCMD
875 STOP
876 ])
877 PSPP_CHECK_SCAN([-i])
878 AT_CLEANUP
879 \f
880 AT_SETUP([DEFINE command - early end of command 3])
881 AT_KEYWORDS([scan])
882 AT_DATA([input], [dnl
883 define !macro1(.
884 x.
885 data list /x 1.
886 ])
887 AT_DATA([expout-base], [dnl
888 ID "define"
889 MACRO_ID "!macro1"
890 LPAREN
891 ENDCMD
892 ID "x"
893 ENDCMD
894 ID "data"
895 ID "list"
896 SLASH
897 ID "x"
898 POS_NUM 1
899 ENDCMD
900 STOP
901 ])
902 PSPP_CHECK_SCAN([-i])
903 AT_CLEANUP
904 \f
905 AT_SETUP([DEFINE command - early end of command 4])
906 AT_KEYWORDS([segment])
907 AT_DATA([input], [dnl
908 dnl Notice the command terminator at the end of the DEFINE command,
909 dnl which should not be there and ends it early.
910 define !macro1.
911 data list /x 1.
912 ])
913 AT_DATA([expout-base], [dnl
914 ID "define"
915 MACRO_ID "!macro1"
916 ENDCMD
917 ID "data"
918 ID "list"
919 SLASH
920 ID "x"
921 POS_NUM 1
922 ENDCMD
923 STOP
924 ])
925 PSPP_CHECK_SCAN([-i])
926 AT_CLEANUP
927 \f
928 AT_SETUP([DEFINE command - missing !ENDDEFINE])
929 AT_KEYWORDS([scan])
930 AT_DATA([input], [dnl
931 define !macro1()
932 content line 1
933 content line 2
934 ])
935 AT_DATA([expout-base], [dnl
936 ID "define"
937 MACRO_ID "!macro1"
938 LPAREN
939 RPAREN
940 STRING "content line 1"
941 STRING "content line 2"
942 STOP
943 ])
944 PSPP_CHECK_SCAN([-i])
945 AT_CLEANUP
946 \f
947 AT_SETUP([batch mode])
948 AT_KEYWORDS([scan])
949 AT_DATA([input], [dnl
950 first command
951      another line of first command
952 +  second command
953 third command
954
955 fourth command.
956    fifth command.
957 ])
958 AT_DATA([expout-base], [dnl
959 ID "first"
960 ID "command"
961 ID "another"
962 ID "line"
963 ID "of"
964 ID "first"
965 ID "command"
966 ENDCMD
967 ID "second"
968 ID "command"
969 ENDCMD
970 ID "third"
971 ID "command"
972 ENDCMD
973 ID "fourth"
974 ID "command"
975 ENDCMD
976 ID "fifth"
977 ID "command"
978 ENDCMD
979 STOP
980 ])
981 PSPP_CHECK_SCAN([-b])
982 AT_CLEANUP