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 @@. #.# .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
86 AT_SETUP([reserved words])
89 and or not eq ge gt le lt ne all by to with
90 AND OR NOT EQ GE GT LE LT NE ALL BY TO WITH
91 andx orx notx eqx gex gtx lex ltx nex allx byx tox withx
94 AT_DATA([expout-base], [dnl
180 PSPP_CHECK_SCAN([-i])
183 AT_SETUP([punctuation])
185 AT_DATA([input], [dnl
186 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
187 ~&|=>=><=<~=<>(),-+*/[[]]**
189 AT_DATA([expout-base], [dnl
253 PSPP_CHECK_SCAN([-i])
258 AT_DATA([input], [dnl
260 123. /* comment 1 */ /* comment 2 */
262 5e1 6E-1 7e+1 6E+01 6e-03
263 .3E1 .4e-1 .5E+1 .6e+01 .7E-03
264 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03
267 AT_DATA([expout-base], [dnl
328 EXPECTED_EXPONENT "1e"
332 EXPECTED_EXPONENT "1e+"
334 EXPECTED_EXPONENT "1e-"
338 PSPP_CHECK_SCAN([-i])
343 AT_DATA([input], [dnl
345 'Don''t' "Can't" 'Won''t'
346 """quoted""" '"quoted"'
349 "missing double quote
352 'a' /* abc */ + "b" /*
353 + 'c' +/* */"d"/* */+'e'
355 + /* special case: + in column 0 would ordinarily start a new command
372 "abc"+U"FFFD"+u'3048'+"xyz"
374 AT_DATA([expout-base], [dnl
433 PSPP_CHECK_SCAN([-i])
436 AT_SETUP([@%:@! construct])
438 AT_DATA([input], [dnl
442 AT_DATA([expout-base], [dnl
457 PSPP_CHECK_SCAN([-i])
460 AT_SETUP([* and COMMENT commands])
462 AT_DATA([input], [dnl
463 * Comment commands "don't
464 have to contain valid tokens.
466 ** Check ambiguity with ** token.
469 comment keyword works too.
471 com is ambiguous with COMPUTE.
473 * Comment need not start at left margin.
475 * Comment ends with blank line
480 AT_DATA([expout-base], [dnl
534 PSPP_CHECK_SCAN([-i])
537 AT_SETUP([DOCUMENT command])
539 AT_DATA([input], [dnl
547 isn't parsed as tokens
551 AT_DATA([expout-base], [dnl
553 STRING "DOCUMENT one line."
571 STRING "first.paragraph"
573 STRING "isn't parsed as tokens"
577 STRING "second paragraph."
583 PSPP_CHECK_SCAN([-i])
586 AT_SETUP([TITLE, SUBTITLE, FILE LABEL commands])
588 AT_DATA([input], [dnl
589 title/**/'Quoted string title'.
591 "Quoted string on second line".
592 sub "Quoted string subtitle"
595 TITL /* Not a */ quoted string title.
596 SUBT Not a quoted string /* subtitle
598 FIL label isn't quoted.
602 /**/ lab not quoted here either
605 AT_DATA([expout-base], [dnl
608 STRING "Quoted string title"
615 STRING "Quoted string on second line"
620 STRING "Quoted string subtitle"
629 STRING "/* Not a */ quoted string title"
634 STRING "Not a quoted string /* subtitle"
642 STRING "isn't quoted"
661 STRING "not quoted here either"
667 PSPP_CHECK_SCAN([-i])
670 AT_SETUP([BEGIN DATA command])
672 AT_DATA([input], [dnl
685 AT_DATA([expout-base], [dnl
724 PSPP_CHECK_SCAN([-i])
727 AT_SETUP([DO REPEAT command])
729 AT_DATA([input], [dnl
732 do repeat a=1 thru 5.
736 end /* x */ /* y */ repeat print.
740 AT_DATA([expout-base], [dnl
763 STRING " do repeat a=1 thru 5."
765 STRING "another command."
767 STRING "second command"
769 STRING "+ third command."
771 STRING "end /* x */ /* y */ repeat print."
781 PSPP_CHECK_SCAN([-i])
784 AT_SETUP([batch mode])
786 AT_DATA([input], [dnl
788 another line of first command
795 AT_DATA([expout-base], [dnl
837 PSPP_CHECK_SCAN([-b])