• Login
Community
  • Login

Best way to find unmatched parentheses

Scheduled Pinned Locked Moved General Discussion
6 Posts 6 Posters 28.4k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R
    Rowan Sylvester-Bradley
    last edited by Jul 5, 2017, 11:11 AM

    What is the best way to find unmatched parens in Notepad++? I have a PHP program which is now giving me “unexpected end of file”. Usually I have found that this is because some structure has been started but not finished, usually a block surrounded by {}. This is a longish program of 1300 lines. What I have tried so far is to put my cursor just after each { character that appears without any preceding tabs, thus highlighting it in red (this of course assumes that I have indented my code correctly, which since it is interspersed with HTML sections is not easy), and then look through the file to find the red } character, which (assuming that Notepad++ is doing its work properly) is the matching paren. If I find a { that doesn’t have a matching }, then that is the problem. This is quite difficult and time consuming, because searching 1300 lines of code for a red } takes time. It is made worse by the fact that N++ doesn’t seem to reliably carry the red line up the left hand margin through HTML sections.

    Do people have a good way of doing this?

    If not, maybe we could add a feature to easily find the matching } for any {, or vice versa, maybe a right click on a { brings up an option to “move to end of block” or something?

    Thanks for your imputs - Rowan

    C 1 Reply Last reply Jul 5, 2017, 6:42 PM Reply Quote 0
    • G
      gstavi
      last edited by Jul 5, 2017, 12:00 PM

      Search -> Go to Matching Brace

      Now there are some rules for brace matching that depends on syntax highlighting. Braces must be in the same type of syntax.
      If you get problems try to force syntax highlighting to Normal text and hope the html parts does not contain uneven braces.

      I implemented a lexer for makefiles that also highlight the background within unmatched parenthesis to help debugging things like:
      $(abspath $(addprefix $(DIR), $(subst $(blah), blah, blah)))
      Perhaps someone can implement some similar generic lexer for that propose.

      1 Reply Last reply Reply Quote 0
      • C
        Claudia Frank @Rowan Sylvester-Bradley
        last edited by Jul 5, 2017, 6:42 PM

        @Rowan-Sylvester-Bradley

        there is a plugin called BracketsCheck which could be useful in such cases.
        Haven’t used php for quite a long time but isn’t there a commandline switch
        to check the syntax of the file? Doesn’t it report line and/or position of the error?
        If so, you could use nppexec plugin to call it and configure output filters to jump
        to the location of the problem.

        Cheers
        Claudia

        1 Reply Last reply Reply Quote 0
        • L
          linpengcheng
          last edited by Jul 16, 2017, 2:06 PM

          Has a plugin like https://github.com/DogLooksGood/parinfer-mode?
          Use it without paying attention to parentheses

          1 Reply Last reply Reply Quote 0
          • G
            guy038
            last edited by guy038 Nov 11, 2019, 9:12 PM Jul 16, 2017, 11:17 PM

            Hello, @rowan-sylvester-bradley, and All,

            The problem about finding a range of characters, containing juxtaposed and/or nested blocks, all well-balanced, can be solved by using recursive regex patterns, exclusively !!

            I’ll going to give, first, the general method. Next, I’ll adapt these general regexes to your particular case !

            Of course, I suppose that blocks of text are defined between two different boundaries, of one character each !


            So, let’s give, first, four notations :

            • SB = starting boundary of blocks. Hence, the regex, with possible \ for escaping as literal

              • < , if the STARTING boundary is the symbol <

              • \( , if the STARTING boundary is the symbol (

              • \{ , if the STARTING boundary is the symbol {

              • \[ , if the STARTING boundary is the symbol [

            • EB = ending boundary of blocks. Hence, the regex, with possible \ for escaping as literal

              • > , if the ENDING boundary is the symbol >

              • \) , if the ENDING boundary is the symbol )

              • \} , if the ENDING boundary is the symbol }

              • \] , if the ENDING boundary is the symbol ]

            • AC = Any single Allowed Character, except for the SB and EB boundaries. Hence, the simple negative class character :

              • [^<>] , if boundaries are the two symbols < and >

              • [^()] , if boundaries are the two symbols ( and )

              • [^{}] , if boundaries are the two symbols { and }

              • [^][] , if boundaries are the two symbols [ and ]

            • R# = Recursive call to capturing group #. Hence, the pre-defined regex (?#)

            Just note that the (?0) or (?R) syntaxes are a recursive call of the overall regex

            Then :

            • The regex A SB(?:AC++|R0)*EB searches the largest area, even on several lines, between a SB boundary and an EB boundary, which may contain other juxtaposed and/or nested blocks SB....EB correctly balanced

            • The regex B AC*(SB(?:AC++|R1)*EB)AC* searches the largest area, even on several lines, between a SB boundary and an EB boundary, which may contain juxtaposed and/or nested blocks SB....EB, all correctly balanced, possibly preceded and / or followed by any range of AC

            • Finally, the regex C (?:AC*(SB(?:AC++|R1)*EB)AC*)+ searches for consecutive largest areas, defined previously. In other words, this regex C finds the largest range of characters, even on several lines, which contains, exactly, the same number of SB and EB boundaries !


            Well, Rowan, now, here is the time of practical works ! As I supposed that your SB is the { symbol and that your EB is the } symbol, I imagined the simple example text, below :

            Beginning of that
            example text :
            
            Mr{{123{456}78}904}0Rowan0{{54{6}4}}SYLVESTER{12345}789{Bradley}67890{}
            ---><---
            Mr{
            {123{45
            6}78
            }90
            4}0Rowan0
            {{54{6}4
            }}SYLVESTER{123
            45}789{Bradley
            }678
            90
            {
            }
            End of that
            example text
            

            Paste it, in a new tab, with a couple of blank lines, at beginning of file

            With your boundaries of blocks, this implies :

            • SB = \{ and EB = \}

            • AC = [^{}]

            • R0 = (?0) and R1 = (?1)

            So, the three general regexes, become, in your case, :

            Regex A : \{(?:[^{}]++|(?0))*\}

            Regex B : [^{}]*(\{(?:[^{}]++|(?1))*\})[^{}]*

            Regex C : (?:[^{}]*(\{(?:[^{}]++|(?1))*\})[^{}]*)+

            Move back, first, to the very beginning of text

            Try, successively, these 3 regexes, containing recursive patterns, against the example text, using the Find >> button, to easily figure out each step !


            Now, let’s try to insert, in the line ---><---, a SB or EB boundary, between the two signs ><. And, using again the 3 regexes A, B and C. Note the true differences, with the previous case. Interesting, isn’t it ?

            I do hope that, with the help of these 3 regexes, you’ll be able to easily locate the wrong { or } boundary, which breaks your well-balanced code and give you the Unexpected End of File message ;-))

            Best Regards,

            guy038

            P.S. : ( Added on 12-20-2017 ! )

            BTW, the regex C is very useful while using the Mark feature, indeed !!

            For instance, let’s use, again, the example text, in a new tab :

            Beginning of that
            example text :
            
            Mr{{123{456}78}904}0Rowan0{{54{6}4}}SYLVESTER{12345}789{Bradley}67890{}
            ---><---
            Mr{
            {123{45
            6}78
            }90
            4}0Rowan0
            {{54{6}4
            }}SYLVESTER{123
            45}789{Bradley
            }678
            90
            {
            }
            End of that
            example text
            
            • Now, insert, in the line ---><---, a SB boundary, {, between the two signs ><

            • Then, open the Mark feature, with the menu option Edit > Mark…

            FIND WHAT (?:[^{}]*(\{(?:[^{}]++|(?1))*\})[^{}]*)+

            OPTIONS Purge for each search , Wrap around and Regular expression checked

            ACTION Click on the Mark All button

            => At once, we can easily see that the {, in the line --->{<--- is the ONLY character, which is NOT marked red. Thus, it means that a EB boundary } should be added, somewhere between this NON-marked { and the END of the file, in order to get a complete text, well-balanced :-)


            • Similarly, insert, in the line ---><---, the EB boundary }, between the two signs ><

            • And open the Mark feature, with the menu option Edit > Mark…

            FIND WHAT (?:[^{}]*(\{(?:[^{}]++|(?1))*\})[^{}]*)+

            OPTIONS Purge for each search , Wrap around and Regular expression checked

            ACTION Click on the Mark All button

            => Again, it happens that the }, in the line --->}<--- is the ONLY character, which is NOT marked red. Thus, it means that a SB boundary { should be added, somewhere between BEGINNING of file and this NON-marked }, in order to get a complete text, well-balanced :-)

            Alan KilbornA 1 Reply Last reply Feb 15, 2022, 3:35 PM Reply Quote 2
            • Alan KilbornA
              Alan Kilborn @guy038
              last edited by Feb 15, 2022, 3:35 PM

              Cross-link to THIS POSTING where related info is discussed.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post
              The Community of users of the Notepad++ text editor.
              Powered by NodeBB | Contributors