Mikael Jagan
2024-Dec-02 15:56 UTC
[Rd] 'else' on new line not parsed at top level as part of preceding 'if'
I wonder if there is room for improvement here: > str2lang("if (a) b1 else b0") if (a) b1 else b0 > str2lang("if (a) b1 \n else b0") Error in str2lang("if (a) b1 \n else b0") : <text>:2:2: unexpected 'else' 1: if (a) b1 2: else ^ It only occurs at top level. When the parser knows that it needs to "keep reading", e.g., because the call to 'if' is enclosed in braces, it detects the 'else': > str2lang("{ if (a) b1 else b0 }") { if (a) b1 else b0 } > str2lang("{ if (a) b1 \n else b0 }") { if (a) b1 else b0 } If people agree that the above is a deficiency/bug then I could create a formal bug report. Then others or I could start thinking about a patch for the parser. Apologies if this issue has been seen and discussed before (most likely by people like me in the habit of dropping braces in calls to 'if' where not strictly necessary). Mikael
Duncan Murdoch
2024-Dec-02 16:05 UTC
[Rd] 'else' on new line not parsed at top level as part of preceding 'if'
This is well known, and it's necessary for reasonable behaviour in an interactive context. Imagine typing the code you were parsing. The first line is if (a) b1 At this point, the interpreter can't know that an else clause is coming. Since the interpreter evaluates statements when they are complete, it will evaluate this and return b1 or NULL. Putting the full expression in braces solves the issue, because this is clearly incomplete: { if (a) b1 Duncan Murdoch On 2024-12-02 10:56 a.m., Mikael Jagan wrote:> I wonder if there is room for improvement here: > > > str2lang("if (a) b1 else b0") > if (a) b1 else b0 > > str2lang("if (a) b1 \n else b0") > Error in str2lang("if (a) b1 \n else b0") : <text>:2:2: unexpected 'else' > 1: if (a) b1 > 2: else > ^ > > It only occurs at top level. When the parser knows that it needs to > "keep reading", e.g., because the call to 'if' is enclosed in braces, > it detects the 'else': > > > str2lang("{ if (a) b1 else b0 }") > { > if (a) > b1 > else b0 > } > > str2lang("{ if (a) b1 \n else b0 }") > { > if (a) > b1 > else b0 > } > > If people agree that the above is a deficiency/bug then I could create a > formal bug report. Then others or I could start thinking about a patch > for the parser. > > Apologies if this issue has been seen and discussed before (most likely > by people like me in the habit of dropping braces in calls to 'if' where > not strictly necessary). > > Mikael > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Duncan Murdoch
2024-Dec-02 16:09 UTC
[Rd] 'else' on new line not parsed at top level as part of preceding 'if'
BTW, this is discussed in section 3.2.1 of "The R Language Definition". Duncan Murdoch On 2024-12-02 10:56 a.m., Mikael Jagan wrote:> I wonder if there is room for improvement here: > > > str2lang("if (a) b1 else b0") > if (a) b1 else b0 > > str2lang("if (a) b1 \n else b0") > Error in str2lang("if (a) b1 \n else b0") : <text>:2:2: unexpected 'else' > 1: if (a) b1 > 2: else > ^ > > It only occurs at top level. When the parser knows that it needs to > "keep reading", e.g., because the call to 'if' is enclosed in braces, > it detects the 'else': > > > str2lang("{ if (a) b1 else b0 }") > { > if (a) > b1 > else b0 > } > > str2lang("{ if (a) b1 \n else b0 }") > { > if (a) > b1 > else b0 > } > > If people agree that the above is a deficiency/bug then I could create a > formal bug report. Then others or I could start thinking about a patch > for the parser. > > Apologies if this issue has been seen and discussed before (most likely > by people like me in the habit of dropping braces in calls to 'if' where > not strictly necessary). > > Mikael > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel