dnl
AT_BANNER([syntax segmentation])
m4_define([PSPP_CHECK_SEGMENT],
- [for strip in "" "-s"; do
+ [AT_CAPTURE_FILE([input])
+ for strip in "" "-s"; do
case $strip in # (
'') sed 's/^-//' < expout-base > expout ;; # (
-s) sed '/^-/d' < expout-base > expout ;;
identifier x space
number 1
identifier y space
-unexpected_char \_
+punct \_
identifier z
-newline \n (later)
-
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
~ & | = >= > <= < ~= <> ( ) , - + * / [[ ]] **
-~&|=>=><=<~=<>(),-+*/[[]]**
+~&|=>=><=<~=<>(),-+*/[[]]**!*
+% : ; ? _ ` { } ~ !*
])
AT_DATA([expout-base], [dnl
punct ~ space
punct [[
punct ]]
punct **
+macro_id !*
+newline \n (later)
+
+punct % space
+punct : space
+punct ; space
+punct ? space
+punct \_ space
+punct ` space
+punct { space
+punct } space
+punct ~ space
+macro_id !*
-newline \n (later)
-
end
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
\f
-AT_SETUP([numbers])
+AT_SETUP([positive numbers])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
0 1 01 001. 1.
])
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
+\f
+AT_SETUP([negative numbers])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+ -0 -1 -01 -001. -1.
+ -123. /* comment 1 */ /* comment 2 */
+ -.1 -0.1 -00.1 -00.10
+ -5e1 -6E-1 -7e+1 -6E+01 -6e-03
+ -.3E1 -.4e-1 -.5E+1 -.6e+01 -.7E-03
+ -1.23e1 -45.6E-1 -78.9e+1 -99.9E+01 -11.2e-03
+ -/**/1
+ -. -1e -e1 -1e+ -1e- -1.
+])
+AT_DATA([expout-base], [dnl
+spaces _
+number -0 space
+number -1 space
+number -01 space
+number -001. space
+number -1
+end_command .
+newline \n (first)
+ space
+number -123
+end_command . space
+comment /*_comment_1_*/ space
+comment /*_comment_2_*/
+newline \n (first)
+ space
+number -.1 space
+number -0.1 space
+number -00.1 space
+number -00.10
+newline \n (later)
+ space
+number -5e1 space
+number -6E-1 space
+number -7e+1 space
+number -6E+01 space
+number -6e-03
+newline \n (later)
+ space
+number -.3E1 space
+number -.4e-1 space
+number -.5E+1 space
+number -.6e+01 space
+number -.7E-03
+newline \n (later)
+ space
+number -1.23e1 space
+number -45.6E-1 space
+number -78.9e+1 space
+number -99.9E+01 space
+number -11.2e-03
+newline \n (later)
+ space
+punct -
+comment /**/
+number 1
+newline \n (later)
+ space
+punct -
+punct . space
+expected_exponent -1e space
+punct -
+identifier e1 space
+expected_exponent -1e+ space
+expected_exponent -1e- space
+number -1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+
\f
AT_SETUP([strings])
AT_KEYWORDS([segment])
newline \n (first)
identifier title space
-unquoted_string my_title
+identifier my space
+identifier title
end_command .
newline \n (first)
PSPP_CHECK_SEGMENT([-i])
AT_CLEANUP
\f
-AT_SETUP([TITLE, SUBTITLE, FILE LABEL commands])
+AT_SETUP([FILE LABEL command])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
-title/**/'Quoted string title'.
-tit /*
-"Quoted string on second line".
-sub "Quoted string subtitle"
- .
-
-TITL /* Not a */ quoted string title.
-SUBT Not a quoted string /* subtitle
-
FIL label isn't quoted.
FILE
lab 'is quoted'.
])
AT_DATA([expout-base], [dnl
-identifier title
-comment /**/
-quoted_string 'Quoted_string_title'
-end_command .
-newline \n (first)
-
-identifier tit space
-comment /*
-newline \n (later)
-
-quoted_string "Quoted_string_on_second_line"
-end_command .
-newline \n (first)
-
-identifier sub space
-quoted_string "Quoted_string_subtitle"
-newline \n (later)
- space
-end_command .
-newline \n (first)
-
-separate_commands
-newline \n (first)
-
-identifier TITL space
-unquoted_string /*_Not_a_*/_quoted_string_title
-end_command .
-newline \n (first)
-
-identifier SUBT space
-unquoted_string Not_a_quoted_string_/*_subtitle
-newline \n (later)
-
-separate_commands
-newline \n (first)
-
identifier FIL space
identifier label space
unquoted_string isn't_quoted
PSPP_CHECK_SEGMENT([-b])
AT_CLEANUP
\f
+AT_SETUP([DEFINE command - simple])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1()
+var1 var2 var3 "!enddefine"
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_body var1_var2_var3_"!enddefine"
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - no newline after parentheses])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1() var1 var2 var3 /* !enddefine
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+macro_body _var1_var2_var3_/*_!enddefine
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - no newline before !ENDDEFINE])
+AT_KEYWORDS([segment ENDDEFINE])
+AT_DATA([input], [dnl
+define !macro1()
+var1 var2 var3!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_body var1_var2_var3
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - all on one line])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1()var1 var2 var3!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+macro_body var1_var2_var3
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - empty])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1()
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - blank lines])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1()
+
+
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_body
+newline \n (DEFINE)
+
+macro_body
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - arguments])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1(a(), b(), c())
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+identifier a
+punct (
+punct )
+punct , space
+identifier b
+punct (
+punct )
+punct , space
+identifier c
+punct (
+punct )
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - multiline arguments])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1(
+ a(), b(
+ ),
+ c()
+)
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+newline \n (later)
+
+spaces __
+identifier a
+punct (
+punct )
+punct , space
+identifier b
+punct (
+newline \n (later)
+
+spaces __
+punct )
+punct ,
+newline \n (later)
+
+spaces __
+identifier c
+punct (
+punct )
+newline \n (later)
+
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - arguments start on second line])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1
+(x,y,z
+)
+content 1
+content 2
+!enddefine.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+newline \n (later)
+
+punct (
+identifier x
+punct ,
+identifier y
+punct ,
+identifier z
+newline \n (later)
+
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_body content_1
+newline \n (DEFINE)
+
+macro_body content_2
+newline \n (DEFINE)
+
+macro_id !enddefine
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 1])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+end_command .
+newline \n (first)
+
+identifier data space
+identifier list space
+punct /
+identifier x space
+number 1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 2])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1
+x.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+newline \n (later)
+
+identifier x
+end_command .
+newline \n (first)
+
+identifier data space
+identifier list space
+punct /
+identifier x space
+number 1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 3])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1(.
+x.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+end_command .
+newline \n (first)
+
+identifier x
+end_command .
+newline \n (first)
+
+identifier data space
+identifier list space
+punct /
+identifier x space
+number 1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - early end of command 4])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+dnl Notice the command terminator at the end of the DEFINE command,
+dnl which should not be there and ends it early.
+define !macro1.
+data list /x 1.
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+end_command .
+newline \n (first)
+
+identifier data space
+identifier list space
+punct /
+identifier x space
+number 1
+end_command .
+-newline \n (first)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
+AT_SETUP([DEFINE command - missing !ENDDEFINE])
+AT_KEYWORDS([segment])
+AT_DATA([input], [dnl
+define !macro1()
+content line 1
+content line 2
+])
+AT_DATA([expout-base], [dnl
+identifier define space
+macro_name !macro1
+punct (
+punct )
+spaces
+newline \n (DEFINE)
+
+macro_body content_line_1
+newline \n (DEFINE)
+
+macro_body content_line_2
+-newline \n (DEFINE)
+-
+end
+])
+PSPP_CHECK_SEGMENT([-i])
+AT_CLEANUP
+\f
AT_SETUP([batch mode])
AT_KEYWORDS([segment])
AT_DATA([input], [dnl
])
PSPP_CHECK_SEGMENT([-a])
AT_CLEANUP
+\f
+# This checks for regression against bug #61253. To see the read of
+# uninitialized data, run with valgrind. The test will pass either
+# way. (The bug report has a more complicated crashing case.)
+AT_SETUP([input ends in carriage return])
+printf '\r' > input
+AT_DATA([expout-base], [dnl
+separate_commands
+spaces \r
+end
+])
+PSPP_CHECK_SEGMENT
+AT_CLEANUP