grammars-v4
grammars-v4 copied to clipboard
[rexx] Concatenation by abuttal and by whitespace are not supported
Rexx has a quirky definition for concatenation. In addition to the common case of an infix binary || operator, there are two more ways to concatenate values. The Rexx standard doesn't give them names, but I call them "concatenation by abuttal" and "concatenation by whitespace". Concatenation by abuttal has the same result as concatenation by the || operator: the two values are simply concatenated. Concatenation by whitespace inserts a single blank between the values.
Abuttal is a weird syntactic case. Basically, if two values can be abutted (i.e., with no intervening whitespace), without lexical confusion (e.g., "a string>"3, or a_function()"a string"), then doing so will concatenate the values. There are some combinations of tokens for which this isn't allowed. For example, "string""string" is the single string value string"string, not two separate strings that will be concatenated. Such cases result in an interpretation that is not concatenation.
I am working on a change to the grammar to represent all three forms of concatenation, and to specifcally make it possible to differentiate between the whitespace and non-whitespace cases from the parse tree.
Are you saying an expression of a_function()"a string" is syntactically legal, but a_function() "a string" is not?
No, they're both legal, but they have different results. Let me put it more succinctly:
a_function() || "a string"is exactly equal to the value ofa_function()concatenated to the value"a string"a_function()"a string"is exactly equal toa_function() || "a string"a_function() "a string"is exactly equal toa_function() || " " || "a string"a_function()...lots of whitespace..."a string"is also exactly equal toa_function() || " " || "a string"
Mike Cowlishaw, who created Rexx, describes concatenation this way in The Rexx Language (2nd. ed.):
The concatenation operators are used to combine two strings to form one string by appending the second string to the right-hand end of the first string. The concatenation may occur with or without an intervening blank:
(blank) Concatenate terms with one blank in between. || Concatenate without an intervening blank. (abuttal) Concatenate without an intervening blank.
Concatenation without a blank may be forced by using the I I operator, but it is useful to remember that when two terms are adjacent and are not separated by an operator, [19] they will be concatenated in the same way. This is the abuttal operation. For example, if the variable TOTAL had the value '3 7 . 4', then Total '%' would evaluate to '3 7 . 4 % '.
[19] This can occur when the terms are syntactically distinct (such as a literal string and a symbol), or when they are separated only by a comment.
Fixed by fbe2034.
Cleaned up by 37d69f57ee646bdc0672f46f0ec3e8660727ef1f at @KvanTTT's request.
All done, closing.