[PATCH 7/8] decodetree: Implement non-overlapping groups

Richard Henderson posted 8 patches 5 years, 6 months ago
Maintainers: Richard Henderson <rth@twiddle.net>, Cleber Rosa <crosa@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Eduardo Habkost <ehabkost@redhat.com>, Peter Maydell <peter.maydell@linaro.org>
There is a newer version of this series
[PATCH 7/8] decodetree: Implement non-overlapping groups
Posted by Richard Henderson 5 years, 6 months ago
Intended to be nested within overlapping groups.

Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 scripts/decodetree.py | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index 0ba01e049c..a9739f671d 100755
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -1021,21 +1021,22 @@ def parse_file(f, parent_pat):
         del toks[0]
 
         # End nesting?
-        if name == '}':
+        if name == '}' or name == ']':
             if len(toks) != 0:
                 error(start_lineno, 'extra tokens after close brace')
             if len(parent_pat.pats) < 2:
                 error(lineno, 'less than two patterns within braces')
 
+            # Make sure { } and [ ] nest properly.
+            if (name == '}') != isinstance(parent_pat, IncMultiPattern):
+                error(lineno, 'mismatched close brace')
+
             try:
                 parent_pat = nesting_pats.pop()
             except:
-                error(lineno, 'mismatched close brace')
+                error(lineno, 'extra close brace')
 
             nesting -= 2
-            if indent != nesting:
-                error(lineno, 'indentation ', indent, ' != ', nesting)
-
             toks = []
             continue
 
@@ -1044,11 +1045,14 @@ def parse_file(f, parent_pat):
             error(start_lineno, 'indentation ', indent, ' != ', nesting)
 
         # Start nesting?
-        if name == '{':
+        if name == '{' or name == '[':
             if len(toks) != 0:
                 error(start_lineno, 'extra tokens after open brace')
 
-            nested_pat = IncMultiPattern(start_lineno)
+            if name == '{':
+                nested_pat = IncMultiPattern(start_lineno)
+            else:
+                nested_pat = ExcMultiPattern(start_lineno)
             parent_pat.pats.append(nested_pat)
             nesting_pats.append(parent_pat)
             parent_pat = nested_pat
@@ -1067,6 +1071,9 @@ def parse_file(f, parent_pat):
         else:
             parse_generic(start_lineno, parent_pat, name, toks)
         toks = []
+
+    if nesting != 0:
+        error(lineno, 'missing close brace')
 # end parse_file
 
 
-- 
2.20.1


Re: [PATCH 7/8] decodetree: Implement non-overlapping groups
Posted by Philippe Mathieu-Daudé 5 years, 6 months ago
On 5/18/20 6:40 PM, Richard Henderson wrote:
> Intended to be nested within overlapping groups.
> 
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   scripts/decodetree.py | 21 ++++++++++++++-------
>   1 file changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/scripts/decodetree.py b/scripts/decodetree.py
> index 0ba01e049c..a9739f671d 100755
> --- a/scripts/decodetree.py
> +++ b/scripts/decodetree.py
> @@ -1021,21 +1021,22 @@ def parse_file(f, parent_pat):
>           del toks[0]
>   
>           # End nesting?
> -        if name == '}':
> +        if name == '}' or name == ']':
>               if len(toks) != 0:
>                   error(start_lineno, 'extra tokens after close brace')
>               if len(parent_pat.pats) < 2:
>                   error(lineno, 'less than two patterns within braces')
>   
> +            # Make sure { } and [ ] nest properly.
> +            if (name == '}') != isinstance(parent_pat, IncMultiPattern):
> +                error(lineno, 'mismatched close brace')
> +
>               try:
>                   parent_pat = nesting_pats.pop()
>               except:
> -                error(lineno, 'mismatched close brace')
> +                error(lineno, 'extra close brace')
>   
>               nesting -= 2
> -            if indent != nesting:
> -                error(lineno, 'indentation ', indent, ' != ', nesting)
> -
>               toks = []
>               continue
>   
> @@ -1044,11 +1045,14 @@ def parse_file(f, parent_pat):
>               error(start_lineno, 'indentation ', indent, ' != ', nesting)
>   
>           # Start nesting?
> -        if name == '{':
> +        if name == '{' or name == '[':
>               if len(toks) != 0:
>                   error(start_lineno, 'extra tokens after open brace')
>   
> -            nested_pat = IncMultiPattern(start_lineno)
> +            if name == '{':
> +                nested_pat = IncMultiPattern(start_lineno)
> +            else:
> +                nested_pat = ExcMultiPattern(start_lineno)
>               parent_pat.pats.append(nested_pat)
>               nesting_pats.append(parent_pat)
>               parent_pat = nested_pat
> @@ -1067,6 +1071,9 @@ def parse_file(f, parent_pat):
>           else:
>               parse_generic(start_lineno, parent_pat, name, toks)
>           toks = []
> +
> +    if nesting != 0:
> +        error(lineno, 'missing close brace')
>   # end parse_file
>   
>   
> 

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>


Re: [PATCH 7/8] decodetree: Implement non-overlapping groups
Posted by Peter Maydell 5 years, 5 months ago
On Mon, 18 May 2020 at 17:41, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Intended to be nested within overlapping groups.
>
> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  scripts/decodetree.py | 21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/scripts/decodetree.py b/scripts/decodetree.py
> index 0ba01e049c..a9739f671d 100755
> --- a/scripts/decodetree.py
> +++ b/scripts/decodetree.py
> @@ -1021,21 +1021,22 @@ def parse_file(f, parent_pat):
>          del toks[0]
>
>          # End nesting?
> -        if name == '}':
> +        if name == '}' or name == ']':
>              if len(toks) != 0:
>                  error(start_lineno, 'extra tokens after close brace')
>              if len(parent_pat.pats) < 2:
>                  error(lineno, 'less than two patterns within braces')
>
> +            # Make sure { } and [ ] nest properly.
> +            if (name == '}') != isinstance(parent_pat, IncMultiPattern):
> +                error(lineno, 'mismatched close brace')
> +
>              try:
>                  parent_pat = nesting_pats.pop()
>              except:
> -                error(lineno, 'mismatched close brace')
> +                error(lineno, 'extra close brace')
>
>              nesting -= 2
> -            if indent != nesting:
> -                error(lineno, 'indentation ', indent, ' != ', nesting)
> -

Why do we lose this error check ?


>              toks = []
>              continue

thanks
-- PMM

Re: [PATCH 7/8] decodetree: Implement non-overlapping groups
Posted by Richard Henderson 5 years, 5 months ago
On 6/2/20 12:13 PM, Peter Maydell wrote:
> On Mon, 18 May 2020 at 17:41, Richard Henderson
> <richard.henderson@linaro.org> wrote:
>>
>> Intended to be nested within overlapping groups.
>>
>> Suggested-by: Peter Maydell <peter.maydell@linaro.org>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>  scripts/decodetree.py | 21 ++++++++++++++-------
>>  1 file changed, 14 insertions(+), 7 deletions(-)
>>
>> diff --git a/scripts/decodetree.py b/scripts/decodetree.py
>> index 0ba01e049c..a9739f671d 100755
>> --- a/scripts/decodetree.py
>> +++ b/scripts/decodetree.py
>> @@ -1021,21 +1021,22 @@ def parse_file(f, parent_pat):
>>          del toks[0]
>>
>>          # End nesting?
>> -        if name == '}':
>> +        if name == '}' or name == ']':
>>              if len(toks) != 0:
>>                  error(start_lineno, 'extra tokens after close brace')
>>              if len(parent_pat.pats) < 2:
>>                  error(lineno, 'less than two patterns within braces')
>>
>> +            # Make sure { } and [ ] nest properly.
>> +            if (name == '}') != isinstance(parent_pat, IncMultiPattern):
>> +                error(lineno, 'mismatched close brace')
>> +
>>              try:
>>                  parent_pat = nesting_pats.pop()
>>              except:
>> -                error(lineno, 'mismatched close brace')
>> +                error(lineno, 'extra close brace')
>>
>>              nesting -= 2
>> -            if indent != nesting:
>> -                error(lineno, 'indentation ', indent, ' != ', nesting)
>> -
> 
> Why do we lose this error check ?

Hmm, wasn't supposed to.  Will fix.


r~