* [libre-riscv-dev] parser precedence, code review / checking needed
@ 2020-04-03 15:19 Luke Kenneth Casson Leighton
2020-04-03 18:22 ` Jacob Lifshay
0 siblings, 1 reply; 6+ messages in thread
From: Luke Kenneth Casson Leighton @ 2020-04-03 15:19 UTC (permalink / raw)
To: Libre-RISCV General Development
if anyone knows how to resolve operator precedence, my logic-dyslexia
is kicking in and i am having difficulty working out which operators
are supposed to be in which order, for bit-wise AND, OR, and
PLUS/MINUS, MUL/DIV. someone else did the PLUS/MINUS MUL/DIV, i'm
attempting to add AND and OR and am getting it wrong
here's how python-ply is supposed to work:
http://www.dabeaz.com/ply/ply.html#ply_nn27
here's a patch showing the relevant files involved:
https://git.libre-riscv.org/?p=soc.git;a=commitdiff;h=39c8314f9a14fb5351a9dcbc8bd37753bdcd0fee
executing "python3 soc/decoder/power_pseudo.py" is a good test, with
this being good example code:
+cmpi = """
+in_range <- (x | y) & (a | b)
+in_range <- (x + y) - (a + b)
+"""
help appreciated.
l.
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [libre-riscv-dev] parser precedence, code review / checking needed
2020-04-03 15:19 [libre-riscv-dev] parser precedence, code review / checking needed Luke Kenneth Casson Leighton
@ 2020-04-03 18:22 ` Jacob Lifshay
2020-04-03 18:49 ` Luke Kenneth Casson Leighton
2020-04-03 20:41 ` Hendrik Boom
0 siblings, 2 replies; 6+ messages in thread
From: Jacob Lifshay @ 2020-04-03 18:22 UTC (permalink / raw)
To: Libre-RISCV General Development
On Fri, Apr 3, 2020, 08:20 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
wrote:
> if anyone knows how to resolve operator precedence, my logic-dyslexia
> is kicking in and i am having difficulty working out which operators
> are supposed to be in which order, for bit-wise AND, OR, and
> PLUS/MINUS, MUL/DIV. someone else did the PLUS/MINUS MUL/DIV, i'm
> attempting to add AND and OR and am getting it wrong
>
The way I always did it is by changing the grammar to have one non-terminal
symbol per precedence level. Example code from my LR(1) parser generator:
https://github.com/programmerjake/parser-generator/blob/master/test.parser#L108-L120
If I were writing the parser I would have used either a hand-written
recursive descent parser (what I used for the shader-compiler-ir text
parser) or a PEG parser, since PEGs don't have ambiguity since they are
defined in terms of the steps taken when parsing instead of being defined
in terms of what strings the rules can produce (LL(1) and LR(1) parsers).
>
> here's how python-ply is supposed to work:
> http://www.dabeaz.com/ply/ply.html#ply_nn27
>
> here's a patch showing the relevant files involved:
>
> https://git.libre-riscv.org/?p=soc.git;a=commitdiff;h=39c8314f9a14fb5351a9dcbc8bd37753bdcd0fee
>
> executing "python3 soc/decoder/power_pseudo.py" is a good test, with
> this being good example code:
> +cmpi = """
> +in_range <- (x | y) & (a | b)
> +in_range <- (x + y) - (a + b)
> +"""
>
since there are parenthesis, precedence between &, |, +, and - doesn't
actually matter here, so it's not a good example. Traditionally + and -
have the same precedence whereas & has higher precedence than | so a & b |
c parses as (a & b) | c.
> help appreciated.
>
Sure, I can figure it out for you if you like. Will be a few minutes.
Jacob
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [libre-riscv-dev] parser precedence, code review / checking needed
2020-04-03 18:22 ` Jacob Lifshay
@ 2020-04-03 18:49 ` Luke Kenneth Casson Leighton
2020-04-03 20:08 ` Jacob Lifshay
2020-04-03 20:41 ` Hendrik Boom
1 sibling, 1 reply; 6+ messages in thread
From: Luke Kenneth Casson Leighton @ 2020-04-03 18:49 UTC (permalink / raw)
To: Libre-RISCV General Development
On Fri, Apr 3, 2020 at 7:23 PM Jacob Lifshay <programmerjake@gmail.com> wrote:
>
> On Fri, Apr 3, 2020, 08:20 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
> wrote:
>
> > if anyone knows how to resolve operator precedence, my logic-dyslexia
> > is kicking in and i am having difficulty working out which operators
> > are supposed to be in which order, for bit-wise AND, OR, and
> > PLUS/MINUS, MUL/DIV. someone else did the PLUS/MINUS MUL/DIV, i'm
> > attempting to add AND and OR and am getting it wrong
> >
>
> The way I always did it is by changing the grammar to have one non-terminal
> symbol per precedence level. Example code from my LR(1) parser generator:
> https://github.com/programmerjake/parser-generator/blob/master/test.parser#L108-L120
ply has something called "precedence" which is a list-of-tuples that
helps resolve parser ambiguities.
> If I were writing the parser I would have used either a hand-written
> recursive descent parser (what I used for the shader-compiler-ir text
> parser) or a PEG parser, since PEGs don't have ambiguity since they are
> defined in terms of the steps taken when parsing instead of being defined
> in terms of what strings the rules can produce (LL(1) and LR(1) parsers).
time. i've used ply before and we're on the clock. i was able to
(eventually) find GardenSnake.py which had been abandoned somewhere
around 2006, and got it operational in under 2 hours.
that saved potentially weeks of time over writing a from-scratch parser.
> > +cmpi = """
> > +in_range <- (x | y) & (a | b)
> > +in_range <- (x + y) - (a + b)
> > +"""
> >
>
> since there are parenthesis, precedence between &, |, +, and - doesn't
> actually matter here, so it's not a good example.
i'd added them as a way to double-check what the output is (and how it
changes if you do (x&y) | (a&b) rather than as it is at the moment.
astor (btw we need to find a much smaller dependency that can do
tree-dump and to_python_source()) is "smart" - unfortunately - and
only prints out *necessary* brackets.
this is confusing me :)
> Traditionally + and -
> have the same precedence whereas & has higher precedence than | so a & b |
> c parses as (a & b) | c.
i think that's what ("left", BINADD, BINOR) would do. i'm just not sure.
> Sure, I can figure it out for you if you like. Will be a few minutes.
thanks jacob.
l.
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [libre-riscv-dev] parser precedence, code review / checking needed
2020-04-03 18:49 ` Luke Kenneth Casson Leighton
@ 2020-04-03 20:08 ` Jacob Lifshay
2020-04-03 21:44 ` Luke Kenneth Casson Leighton
0 siblings, 1 reply; 6+ messages in thread
From: Jacob Lifshay @ 2020-04-03 20:08 UTC (permalink / raw)
To: Libre-RISCV General Development
On Fri, Apr 3, 2020 at 11:50 AM Luke Kenneth Casson Leighton
<lkcl@lkcl.net> wrote:
>
> On Fri, Apr 3, 2020 at 7:23 PM Jacob Lifshay <programmerjake@gmail.com> wrote:
> >
> > On Fri, Apr 3, 2020, 08:20 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
> > wrote:
> >
> > > if anyone knows how to resolve operator precedence, my logic-dyslexia
> > > is kicking in and i am having difficulty working out which operators
> > > are supposed to be in which order, for bit-wise AND, OR, and
> > > PLUS/MINUS, MUL/DIV. someone else did the PLUS/MINUS MUL/DIV, i'm
> > > attempting to add AND and OR and am getting it wrong
> > >
> >
> > The way I always did it is by changing the grammar to have one non-terminal
> > symbol per precedence level. Example code from my LR(1) parser generator:
> > https://github.com/programmerjake/parser-generator/blob/master/test.parser#L108-L120
>
> ply has something called "precedence" which is a list-of-tuples that
> helps resolve parser ambiguities.
Just because something has a feature, doesn't mean that it's the best
way to do it.
As far as I can tell, it's working now.
Jacob
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [libre-riscv-dev] parser precedence, code review / checking needed
2020-04-03 18:22 ` Jacob Lifshay
2020-04-03 18:49 ` Luke Kenneth Casson Leighton
@ 2020-04-03 20:41 ` Hendrik Boom
1 sibling, 0 replies; 6+ messages in thread
From: Hendrik Boom @ 2020-04-03 20:41 UTC (permalink / raw)
To: libre-riscv-dev
On Fri, Apr 03, 2020 at 11:22:56AM -0700, Jacob Lifshay wrote:
> On Fri, Apr 3, 2020, 08:20 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
> wrote:
...
> > +in_range <- (x | y) & (a | b)
> > +in_range <- (x + y) - (a + b)
> > +"""
> >
>
> since there are parenthesis, precedence between &, |, +, and - doesn't
> actually matter here, so it's not a good example. Traditionally + and -
> have the same precedence whereas & has higher precedence than | so a & b |
> c parses as (a & b) | c.
Presumably because the early logicians treated 'and' as being a multiplication
and 'or' as being an addition.
-- hendrik
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [libre-riscv-dev] parser precedence, code review / checking needed
2020-04-03 20:08 ` Jacob Lifshay
@ 2020-04-03 21:44 ` Luke Kenneth Casson Leighton
0 siblings, 0 replies; 6+ messages in thread
From: Luke Kenneth Casson Leighton @ 2020-04-03 21:44 UTC (permalink / raw)
To: Libre-RISCV General Development
On Fri, Apr 3, 2020 at 9:08 PM Jacob Lifshay <programmerjake@gmail.com> wrote:
> > ply has something called "precedence" which is a list-of-tuples that
> > helps resolve parser ambiguities.
>
> Just because something has a feature, doesn't mean that it's the best
> way to do it.
yeh i know :) ply was replaced by sly for good reasons. ply was - is
- FAST. it did not - does not - use classes because classes use up a
lot more memory and are slower. however with pretty much everyone now
possessing portable supercomputers, that's no longer so relevant.
the only reason i'm using it is because it's something i've worked
with about... five to eight times now. i forget :)
> As far as I can tell, it's working now.
fantastic. thank you. whew.
l.
_______________________________________________
libre-riscv-dev mailing list
libre-riscv-dev@lists.libre-riscv.org
http://lists.libre-riscv.org/mailman/listinfo/libre-riscv-dev
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, back to index
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-03 15:19 [libre-riscv-dev] parser precedence, code review / checking needed Luke Kenneth Casson Leighton
2020-04-03 18:22 ` Jacob Lifshay
2020-04-03 18:49 ` Luke Kenneth Casson Leighton
2020-04-03 20:08 ` Jacob Lifshay
2020-04-03 21:44 ` Luke Kenneth Casson Leighton
2020-04-03 20:41 ` Hendrik Boom
Libre RISC-V Mailing list Archives (accessible via public-inbox)
Archives are clonable: git clone --mirror https://inbox.libre-soc.org/libre-riscv-dev
Example config snippet for mirrors
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git