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/>.
16 dnl AT_BANNER([syntax scanning])
17 m4_define([PSPP_CHECK_SCAN],
18 [AT_CHECK([scan-test $1 input], [0], [expout])])
20 AT_SETUP([identifiers])
23 a aB i5 $x @efg @@. #.# .x _z.
25 QRSTUV./* end of line comment */
26 QrStUv./* end of line comment */ @&t@
27 WXYZ. /* unterminated end of line comment
28 �. /* U+FFFD is not valid in an identifier
30 AT_DATA([expout], [dnl
81 AT_SETUP([reserved words])
84 and or not eq ge gt le lt ne all by to with
85 AND OR NOT EQ GE GT LE LT NE ALL BY TO WITH
86 andx orx notx eqx gex gtx lex ltx nex allx byx tox withx
89 AT_DATA([expout], [dnl
175 PSPP_CHECK_SCAN([-i])
178 AT_SETUP([punctuation])
180 AT_DATA([input], [dnl
181 ~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
182 ~&|=>=><=<~=<>(),-+*/[[]]**
184 AT_DATA([expout], [dnl
248 PSPP_CHECK_SCAN([-i])
253 AT_DATA([input], [dnl
255 123. /* comment 1 */ /* comment 2 */
257 5e1 6E-1 7e+1 6E+01 6e-03
258 .3E1 .4e-1 .5E+1 .6e+01 .7E-03
259 1.23e1 45.6E-1 78.9e+1 99.9E+01 11.2e-03
262 AT_DATA([expout], [dnl
323 EXPECTED_EXPONENT "1e"
327 EXPECTED_EXPONENT "1e+"
329 EXPECTED_EXPONENT "1e-"
333 PSPP_CHECK_SCAN([-i])
338 AT_DATA([input], [dnl
340 'Don''t' "Can't" 'Won''t'
341 """quoted""" '"quoted"'
344 "missing double quote
347 'a' /* abc */ + "b" /*
348 + 'c' +/* */"d"/* */+'e'
350 + /* special case: + in column 0 would ordinarily start a new command
367 "abc"+U"FFFD"+u'3048'+"xyz"
369 AT_DATA([expout], [dnl
428 PSPP_CHECK_SCAN([-i])
431 AT_SETUP([@%:@! construct])
433 AT_DATA([input], [dnl
437 AT_DATA([expout], [dnl
452 PSPP_CHECK_SCAN([-i])
455 AT_SETUP([* and COMMENT commands])
457 AT_DATA([input], [dnl
458 * Comment commands "don't
459 have to contain valid tokens.
461 ** Check ambiguity with ** token.
464 comment keyword works too.
466 com is ambiguous with COMPUTE.
468 * Comment need not start at left margin.
470 * Comment ends with blank line
475 AT_DATA([expout], [dnl
529 PSPP_CHECK_SCAN([-i])
532 AT_SETUP([DOCUMENT command])
534 AT_DATA([input], [dnl
542 isn't parsed as tokens
546 AT_DATA([expout], [dnl
548 STRING "DOCUMENT one line."
566 STRING "first.paragraph"
568 STRING "isn't parsed as tokens"
572 STRING "second paragraph."
578 PSPP_CHECK_SCAN([-i])
581 AT_SETUP([TITLE, SUBTITLE, FILE LABEL commands])
583 AT_DATA([input], [dnl
584 title/**/'Quoted string title'.
586 "Quoted string on second line".
587 sub "Quoted string subtitle"
590 TITL /* Not a */ quoted string title.
591 SUBT Not a quoted string /* subtitle
593 FIL label isn't quoted.
597 /**/ lab not quoted here either
600 AT_DATA([expout], [dnl
603 STRING "Quoted string title"
610 STRING "Quoted string on second line"
615 STRING "Quoted string subtitle"
624 STRING "/* Not a */ quoted string title"
629 STRING "Not a quoted string /* subtitle"
637 STRING "isn't quoted"
656 STRING "not quoted here either"
662 PSPP_CHECK_SCAN([-i])
665 AT_SETUP([BEGIN DATA command])
667 AT_DATA([input], [dnl
680 AT_DATA([expout], [dnl
719 PSPP_CHECK_SCAN([-i])
722 AT_SETUP([DO REPEAT command])
724 AT_DATA([input], [dnl
727 do repeat a=1 thru 5.
731 end /* x */ /* y */ repeat print.
735 AT_DATA([expout], [dnl
758 STRING " do repeat a=1 thru 5."
760 STRING "another command."
762 STRING "second command"
764 STRING "+ third command."
766 STRING "end /* x */ /* y */ repeat print."
776 PSPP_CHECK_SCAN([-i])
779 AT_SETUP([batch mode])
781 AT_DATA([input], [dnl
783 another line of first command
790 AT_DATA([expout], [dnl
832 PSPP_CHECK_SCAN([-b])