RE: Recursive Descent vs. LALR

Quinn Tyler Jackson <qjackson@shaw.ca>
4 Jul 2003 00:13:46 -0400

          From comp.compilers

Related articles
RE: Recursive Descent vs. LALR qjackson@shaw.ca (Quinn Tyler Jackson) (2003-07-04)
porting of gcc peephole opt rong@capsl.udel.edu (Hongbo Rong) (2003-07-15)
RE: porting of gcc peephole opt Barak.Zalstein@ParthusCeva.com (Barak Zalstein) (2003-07-17)
| List of all articles for this month |

From: Quinn Tyler Jackson <qjackson@shaw.ca>
Newsgroups: comp.compilers
Date: 4 Jul 2003 00:13:46 -0400
Organization: Compilers Central
Keywords: parse
Posted-Date: 04 Jul 2003 00:13:46 EDT
In-reply-to: 03-07-024

Chris F. Clark said:

> It is worth noting that the intersection of two cfgs need not be a
> cfg, but the intersection of two csgs is a csg. Predicates
> (mentioned above) allow one to write grammatically grammars that
> are the intersection of context free grammars, which allows
> predicated parsers (either LL or LR) to parse context-sensitive
> languages.

That turns out to be a nifty observation in theory, so I thought I
would demonstrate it in practice.

grammar AnBnCn
{
S ::=

($a(X S.x<*>) $b(Y S.y<*>))<a b=anbn> $c(Z<S.x!=S.z> S.z<*>)<b
c=bncn>;

anbn ::= S.x [anbn] S.y;
bncn ::= S.y [bncn] S.z;

X ::= $S.x<-("(" '[a-z][a-z]+' ")");

Y ::= $S.y<-("(" '[a-z][a-z]+' ")");

Z ::= $S.z<-("(" '[a-z][a-z]+' ")");
}; // grammar AnBnCn

The above $-grammar accepts strings in the form:

(a)^n(b)^n(c)^n where |a| > 1, |b| > 1, |c| > 1, and a != c

Thus:

(cat)(cat)(dog)(dog)(mouse)(mouse)

but not

(cat)(cat)(dog)(mouse)(mouse)

and not

(cat)(cat)(mouse)(mouse)(cat)(cat)

How it actually goes about its magic is found in the back referencing
and predicates.

Here's an English-ed version of the first production, S:

$a(X S.x<*>))

"Match an X followed by zero to many of whatever X matched, and place
the result into a."

  $b(Y S.y<*>))<a b=anbn>

"Match a Y followed by zero to many of whatever Y matched, and place
the result into b. Concatenate a and b, and parse the resulting string
with anbn. Fail if a+b is not accepted by anbn."

$c(Z<S.x!=S.z> S.z<*>)<b c=bncn>

"Match a Z. Fail if whatever matched X is equal to whatever matched Z,
otherwise, match zero to many of whatever matched Z, and place the
final result into c. Concatenate b and c, and parse the resulting
string with bncn. Fail if b+c is not accepted by bncn."

The cumulative result of the predicate intersections and the back
referencing is a grammar that accepts the language described.

> BTW, adaptive grammars are equivalent in power to TMs.

Right. Strictly speaking, the notations in the above grammar are
sufficient for Turing Power (give or take a notation), but I leave
that as an exercise for the reader.

--
Quinn Tyler Jackson


Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.