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 [AT_CHECK([scan-test $1 input], [0], [expout])])
21 AT_SETUP([identifiers])
24 a aB i5 $x @efg @@. #.# .x _z.
26 QRSTUV./* end of line comment */
27 QrStUv./* end of line comment */ @&t@
28 WXYZ. /* unterminated end of line comment
29 �. /* U+FFFD is not valid in an identifier
31 AT_DATA([expout], [dnl
82 AT_SETUP([reserved words])
85 and or not eq ge gt le lt ne all by to with
86 AND OR NOT EQ GE GT LE LT NE ALL BY TO WITH
87 andx orx notx eqx gex gtx lex ltx nex allx byx tox withx
90 AT_DATA([expout], [dnl
176 PSPP_CHECK_SCAN([-i])
179 AT_SETUP([punctuation])
181 AT_DATA([input], [dnl
182 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
183 ~&|=>=><=<~=<>(),-+*/[[]]**
185 AT_DATA([expout], [dnl
249 PSPP_CHECK_SCAN([-i])
254 AT_DATA([input], [dnl
256 123. /* comment 1 */ /* comment 2 */
258 5e1 6E-1 7e+1 6E+01 6e-03
259 .3E1 .4e-1 .5E+1 .6e+01 .7E-03
260 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03
263 AT_DATA([expout], [dnl
324 EXPECTED_EXPONENT "1e"
328 EXPECTED_EXPONENT "1e+"
330 EXPECTED_EXPONENT "1e-"
334 PSPP_CHECK_SCAN([-i])
339 AT_DATA([input], [dnl
341 'Don''t' "Can't" 'Won''t'
342 """quoted""" '"quoted"'
345 "missing double quote
348 'a' /* abc */ + "b" /*
349 + 'c' +/* */"d"/* */+'e'
351 + /* special case: + in column 0 would ordinarily start a new command
368 "abc"+U"FFFD"+u'3048'+"xyz"
370 AT_DATA([expout], [dnl
429 PSPP_CHECK_SCAN([-i])
432 AT_SETUP([@%:@! construct])
434 AT_DATA([input], [dnl
438 AT_DATA([expout], [dnl
453 PSPP_CHECK_SCAN([-i])
456 AT_SETUP([* and COMMENT commands])
458 AT_DATA([input], [dnl
459 * Comment commands "don't
460 have to contain valid tokens.
462 ** Check ambiguity with ** token.
465 comment keyword works too.
467 com is ambiguous with COMPUTE.
469 * Comment need not start at left margin.
471 * Comment ends with blank line
476 AT_DATA([expout], [dnl
530 PSPP_CHECK_SCAN([-i])
533 AT_SETUP([DOCUMENT command])
535 AT_DATA([input], [dnl
543 isn't parsed as tokens
547 AT_DATA([expout], [dnl
549 STRING "DOCUMENT one line."
567 STRING "first.paragraph"
569 STRING "isn't parsed as tokens"
573 STRING "second paragraph."
579 PSPP_CHECK_SCAN([-i])
582 AT_SETUP([TITLE, SUBTITLE, FILE LABEL commands])
584 AT_DATA([input], [dnl
585 title/**/'Quoted string title'.
587 "Quoted string on second line".
588 sub "Quoted string subtitle"
591 TITL /* Not a */ quoted string title.
592 SUBT Not a quoted string /* subtitle
594 FIL label isn't quoted.
598 /**/ lab not quoted here either
601 AT_DATA([expout], [dnl
604 STRING "Quoted string title"
611 STRING "Quoted string on second line"
616 STRING "Quoted string subtitle"
625 STRING "/* Not a */ quoted string title"
630 STRING "Not a quoted string /* subtitle"
638 STRING "isn't quoted"
657 STRING "not quoted here either"
663 PSPP_CHECK_SCAN([-i])
666 AT_SETUP([BEGIN DATA command])
668 AT_DATA([input], [dnl
681 AT_DATA([expout], [dnl
720 PSPP_CHECK_SCAN([-i])
723 AT_SETUP([DO REPEAT command])
725 AT_DATA([input], [dnl
728 do repeat a=1 thru 5.
732 end /* x */ /* y */ repeat print.
736 AT_DATA([expout], [dnl
759 STRING " do repeat a=1 thru 5."
761 STRING "another command."
763 STRING "second command"
765 STRING "+ third command."
767 STRING "end /* x */ /* y */ repeat print."
777 PSPP_CHECK_SCAN([-i])
780 AT_SETUP([batch mode])
782 AT_DATA([input], [dnl
784 another line of first command
791 AT_DATA([expout], [dnl
833 PSPP_CHECK_SCAN([-b])