* lexing @ 2015-11-29 15:24 Ray Andrews 2015-11-29 17:13 ` lexing ZyX 2015-11-29 18:07 ` lexing Bart Schaefer 0 siblings, 2 replies; 10+ messages in thread From: Ray Andrews @ 2015-11-29 15:24 UTC (permalink / raw) To: Zsh Users Gentlemen: The syntax highlighting in my editors makes the predictable mistake when it bumps into these: (#b) (#c1,2) (#a3) because the lexing mostly follows bash rules. The people who write the highlighter are interested in fixing that for zsh, but they want a rigorous description of the rule. As far as I know the only rule there is that if the hash is preceded by an open parenthesis then it is not a comment. Is that sufficient or are there further subtleties? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-29 15:24 lexing Ray Andrews @ 2015-11-29 17:13 ` ZyX 2015-11-29 18:07 ` lexing Bart Schaefer 1 sibling, 0 replies; 10+ messages in thread From: ZyX @ 2015-11-29 17:13 UTC (permalink / raw) To: Ray Andrews, Zsh Users 29.11.2015, 18:26, "Ray Andrews" <rayandrews@eastlink.ca>: > Gentlemen: > > The syntax highlighting in my editors makes the predictable mistake when > it bumps into these: > > (#b) > (#c1,2) > (#a3) > > because the lexing mostly follows bash rules. The people who write the > highlighter are interested in fixing that for zsh, but they want a > rigorous description of the rule. As far as I know the only rule there > is that if the hash is preceded by an open parenthesis then it is not a > comment. Is that sufficient or are there further subtleties? With `setopt extendedglob` `echo ech#test` errors with `zsh: no match`: AFAIR this is something like `*` in PCRE (and `##` is `+` in PCRE). With `unsetopt extendedglob` `echo ech#test` echoes `ech#test`, `interactivecomments` option is set in both cases. So the rule I think would be that `#` starts a comment if it is preceded by a whitespace. Also: 1. ${(kv#)var} 2. ${#var}: usual thing, also in POSIX shells 3. $#var 4. ${(s. # .)var} 5. $(( #var )) (usually causes Vim highlighting to fail) (also $[ #var ]) 6. ${var// # /test} 7. ${var//# /test} (hash means different thing here) 8. ${var%#}, ${var:-#}, etc (POSIX) 9. '#', "#", \# (POSIX, ways of escaping hash) Note that `posh -c 'echo foo#bar'` (also bash, dash, busybox and ksh) echoes `foo#bar`. So without `setopt extendedglob` this is not zsh-specific. So if they show a “predictable mistake” in this case as well then they are false regardless of the shell they write highlighting for. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-29 15:24 lexing Ray Andrews 2015-11-29 17:13 ` lexing ZyX @ 2015-11-29 18:07 ` Bart Schaefer 2015-11-30 2:10 ` lexing Ray Andrews 1 sibling, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2015-11-29 18:07 UTC (permalink / raw) To: Zsh Users On Nov 29, 7:24am, Ray Andrews wrote: } } The people who write the highlighter are interested in fixing that } for zsh, but they want a rigorous description of the rule. As far as } I know the only rule there is that if the hash is preceded by an open } parenthesis then it is not a comment. Is that sufficient or are there } further subtleties? I'll leave the following analysis of all the places where a "#" is NOT a comment, because I went to the trouble of writing it all down, after which I realized it's a whole lot easier to explain: The # character introduces a comment ONLY when it is immediately preceded by a command terminator (including start of line) or by whitespace that acts as a word separator. Everywhere else, # is NOT a comment, in contexts such as: $# is the obvious one, but they probably have that covered. Also any "#" that appears inside ${...} should not be treated as a comment, except that inside $(...) the normal comment rules apply even if that is also inside ${...}. (Aside to zsh-workers: $(...) is apparently NOT "interactive" even if typed at the command line, for INTERACTIVE_COMMENTS purposes.) In arithmetic expressions, digits followed by "#" are the base of the number, e.g., 2#111 is 10#7. Also open-bracket followed by "#" and then digits and close-bracket specifies an output base, e.g. $[[#2]7] substitutes 2#111 -- I'm deliberately using the $[...] alternative to $(( [#2] 7 )) and squashing spaces). Oh, and [#10_3] means output base 10 with underscores between every group of 3 digits, and [##8] means output in octal with no 8# prefix (works for any base). Then (still in math context) there's ##Z which outputs the value of the character Z, which can also be a sequence e.g. $(( ##\e )) is 27, and (( #VAR )) is the same as ## except on the first character in the value of $VAR. The form you're using (#something), is only not-a-comment in pattern or filename-generation context, so $(# this IS a comment). And of course once you have started a (#...) that is not a comment, any # that is before the closing paren is also not a comment. Lastly there's # and ## at the end of any string in pattern or name- generation context, which is never a comment even if extended_glob is not set. Final note: The one thing zsh borrowed from csh that I freely concede is pretty horrible, is the ability to change the comment character by changing the third character of $histchars. Please never do this. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-29 18:07 ` lexing Bart Schaefer @ 2015-11-30 2:10 ` Ray Andrews 2015-11-30 3:33 ` lexing Daniel Shahaf 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2015-11-30 2:10 UTC (permalink / raw) To: zsh-users On 11/29/2015 10:07 AM, Bart Schaefer wrote: > The # character introduces a comment ONLY when it is immediately > preceded by a command terminator (including start of line) or by > whitespace that acts as a word separator. Ok, so the comment is actually the exception. That spares me going through ZyX's list and seeing which of them is highlighted wrong. I expect there's a big overlap with bash rules anyway, so we're only interested in exceptions from bash. > Everywhere else, # is NOT a comment, in contexts such as: Yeah, I know the hash is used all over the place, but I've only noticed the " (#...) " error so far, tho I suppose I should check all the other candidates. > The form you're using (#something), is only not-a-comment in pattern > or filename-generation context, so $(# this IS a comment). When will I run out of things that astonish me about zsh syntax? What sort of need would there be to put a comment inside " $(#...) " ? So that's a comment but " (#b) " is not a comment ... sometimes, but don't bet on it. > Final note: The one thing zsh borrowed from csh that I freely concede > is pretty horrible, is the ability to change the comment character by > changing the third character of $histchars. Please never do this. Pardon the mini-rant, but that's demented. So the whole edifice of zsh lexing, all the stuff mentioned, and everything else, has to be filtered thu some engine that first determines if the comment character has been changed? Changed to what? What character is 'free' for assumption as the comment marker? I don' t know if I'll ever understand. > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-30 2:10 ` lexing Ray Andrews @ 2015-11-30 3:33 ` Daniel Shahaf 2015-11-30 4:20 ` lexing Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Daniel Shahaf @ 2015-11-30 3:33 UTC (permalink / raw) To: Ray Andrews; +Cc: zsh-users Ray Andrews wrote on Sun, Nov 29, 2015 at 18:10:30 -0800: > On 11/29/2015 10:07 AM, Bart Schaefer wrote: > >The form you're using (#something), is only not-a-comment in pattern > >or filename-generation context, so $(# this IS a comment). > > When will I run out of things that astonish me about zsh syntax? > What sort of need would there be to put a comment inside " $(#...) " > ? So that's a comment but " (#b) " is not a comment ... sometimes, > but don't bet on it. For the same reason as always — to document things for the next reader: echo $( # Use a subshell because foo chokes if isatty(1) foo ) I don't think Bart mentioned the subshell syntax: ( # this is a comment echo 42 ) ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-30 3:33 ` lexing Daniel Shahaf @ 2015-11-30 4:20 ` Ray Andrews 2015-11-30 4:47 ` lexing Ray Andrews 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2015-11-30 4:20 UTC (permalink / raw) To: zsh-users On 11/29/2015 07:33 PM, Daniel Shahaf wrote: > For the same reason as always — to document things for the next reader: Yup, that's questions and answers are for. > echo $( # Use a subshell because foo chokes if isatty(1) foo ) I don't > think Bart mentioned the subshell syntax: ( # this is a comment echo 42 ) As long as his general rule holds. The white space serves as a word separator, so really, following that more or less simple rule, it hasta be a comment, which pretty much kills my last mini-rant--it's a comment because the rule makes it a comment, and because there's no reason to take the trouble to prevent it from being a comment so it's a comment, strange as it might look. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-30 4:20 ` lexing Ray Andrews @ 2015-11-30 4:47 ` Ray Andrews 2015-11-30 16:23 ` lexing Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Ray Andrews @ 2015-11-30 4:47 UTC (permalink / raw) To: zsh-users A fruitful hunt for highlighting errors: These are not mistaken as comments: #!/usr/bin/zsh ${(kv#)var} ${#var} $#var ${(s. # .)var} ${var// # /test} ${var//# /test} ${var%#}, ${var:-#} 2#111 '#', "#", \# `posh -c 'echo foo#bar'` These are mistaken for comments: (#b) (#c1,2) (#a3) $[[#2]7] ##Z ... as are these: $(( ##\e )) is 27, (( #VAR )) $(( #var )) ... but, given that there is preceding whitespace, would these three not break Bart's rule? Perhaps the whitespace here is does not qualify as 'word separating'? Or is the " $(()) " construct an exception? ... and unfortunately: $(# this IS a comment). is not considered to be a comment. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-30 4:47 ` lexing Ray Andrews @ 2015-11-30 16:23 ` Bart Schaefer 2015-11-30 16:50 ` lexing Ray Andrews 2015-12-04 19:15 ` master class Ray Andrews 0 siblings, 2 replies; 10+ messages in thread From: Bart Schaefer @ 2015-11-30 16:23 UTC (permalink / raw) To: zsh-users On Nov 29, 8:47pm, Ray Andrews wrote: } } $(( ##\e )) is 27, } (( #VAR )) } $(( #var )) } } ... but, given that there is preceding whitespace, would these three not } break Bart's rule? Perhaps the whitespace here is does not qualify as } 'word separating'? Or is the " $(()) " construct an exception? The whitespace is not "word separating" because (( stuff )) is shorthand for let "stuff" so the spaces are quoted, at the level at which comments apply. $(( )) is just a way to substitute inline the "let". ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: lexing 2015-11-30 16:23 ` lexing Bart Schaefer @ 2015-11-30 16:50 ` Ray Andrews 2015-12-04 19:15 ` master class Ray Andrews 1 sibling, 0 replies; 10+ messages in thread From: Ray Andrews @ 2015-11-30 16:50 UTC (permalink / raw) To: zsh-users On 11/30/2015 08:23 AM, Bart Schaefer wrote: > On Nov 29, 8:47pm, Ray Andrews wrote: > } > } $(( ##\e )) is 27, > } (( #VAR )) > } $(( #var )) > } > } ... but, given that there is preceding whitespace, would these three not > } break Bart's rule? Perhaps the whitespace here is does not qualify as > } 'word separating'? Or is the " $(()) " construct an exception? > > The whitespace is not "word separating" because (( stuff )) is shorthand > for > let "stuff" > so the spaces are quoted, at the level at which comments apply. $(( )) > is just a way to substitute inline the "let". > I thought of that construction as 'math'. But ... well nuts, so it is, and so is 'let' but with the implied quotation. So visually it's a gotcha, but not a very deep gotcha. So it's an exception but it should be simple enough to lex. Mysteries evaporate when one sees what's under the hood. ^ permalink raw reply [flat|nested] 10+ messages in thread
* master class 2015-11-30 16:23 ` lexing Bart Schaefer 2015-11-30 16:50 ` lexing Ray Andrews @ 2015-12-04 19:15 ` Ray Andrews 1 sibling, 0 replies; 10+ messages in thread From: Ray Andrews @ 2015-12-04 19:15 UTC (permalink / raw) To: zsh-users All, I've run out of things to do in zsh. If one of you would be so gracious as to look over my respin of Sebastian's stuff and point out any errors or improvements I'd consider it a great kindness. I'd call it a master class except that I'm not a master, but maybe no longer a novice either. Otherwise I'm about done and will more or less leave you guys in peace. Many thanks for the lessons and (from most) the patience. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-12-04 19:15 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-11-29 15:24 lexing Ray Andrews 2015-11-29 17:13 ` lexing ZyX 2015-11-29 18:07 ` lexing Bart Schaefer 2015-11-30 2:10 ` lexing Ray Andrews 2015-11-30 3:33 ` lexing Daniel Shahaf 2015-11-30 4:20 ` lexing Ray Andrews 2015-11-30 4:47 ` lexing Ray Andrews 2015-11-30 16:23 ` lexing Bart Schaefer 2015-11-30 16:50 ` lexing Ray Andrews 2015-12-04 19:15 ` master class Ray Andrews
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/zsh/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).