[cpl] [Tema 1] Substring in dispatch
Bogdan Nitulescu
bogdannitulescu at yahoo.com
Thu Oct 27 08:40:20 EEST 2016
Salut,
Exista mai multe locuri in limbaj unde este folosita structura [ ] :
virtual method dispatch, substring, array index. Toate sunt expresii, si
pentru fiecare din ele avem mai multe posibilitati in limbaj:
dispatch, diverse forme:
[ <expression>::<identifier>.<identifier> <expression>, ... ,
<expression>]
[ <expression>.<identifier> <expression>, ... , <expression>]
[<identifier> <expression>, ... , <expression>]
substring: <expression> [<expression>,<expression>]
array index: <expression>[<expression>]
Constructiile nu introduc ambiguitati. Static dispatch ('[a::b.c d]') si
object dispatch ('[a.b c]') sunt suficient de distincte pentru ca au
tokeni specifici, "::" si "." , ce nu apar altfel intre "[ ]" .
Ramane sa poti distinge intre a[x] - vector ; a[x,y] - substring; si [a
x] - self dispatch. Aici te ajuta o alta restrictie din limbaj - un
dispatch '[a x]' trebuie sa inceapa neaparat cu un identificator; deci,
daca esti in contextul in care este asteptata o expresie si intalnesti
'[a[x]]' , dupa ce ai parsat '[' ai neaparat un dispatch catre metoda
'a', cu parametrul expresia '[x]' ; si nu poti avea un array index 'a[x]'.
Un parser LR se descurca sa faca diferenta intre "[a[x].a x]" unde dupa
"[" urmeaza o expresie; si "[a a[x]]" unde dupa "[" urmeaza un
identificator, pentru ca va face SHIFT intotdeauna si va face REDUCE mai
tarziu. Intr-adevar, un LL simplu nu ar putea.
Hint: gramatica din bison nu trebuie sa fie neaparat pe aceeasi
structura pe care se genereaza AST-ul (arborele de derivare si cel
sintactic pot fi diferiti). In plus, daca ai conflict SHIFT REDUCE dar
stii sa il rezolvi, poti folosi reguli implicite de precendenta, atat
timp cat documentezi alegerea lor.
--Bogdan
On 10/26/2016 11:40 PM, Călin Cruceru via cpl wrote:
> Salutare,
>
> Tot nu înțeleg.
>
> 2016-10-26 0:51 GMT+03:00 Andrei Tuicu via cpl <cpl at cursuri.cs.pub.ro>:
>> Salut, Calin,
>>
>> Am sa trec pe lista discutia inceputa la laborator, pentru a o poatea vedea
>> si ceilalti colegi care se mai lovesc de acesta problema. Asa cum ti-a dat
>> si Lavinia hint-ul in intrebarea din mailul precedent; din moment ce nu se
>> poate face reduce pentru nicio regula, dar inca exista in gramatica reguli
>> pentru care se poate face un match "partial" (daca se poate spune asa) se va
>> face shift.
>>
>> Plecand de la exemplele tale: "[a[1,2].foo]" sau "[a [foo]]"
>>
>> in momentul in care se ajungi sa ai "[a" pe stiva si lookahead-ul "[" -> in
>> acest caz, poti face doar shift. Ai 2 reguli care fac "match partial", in
>> sensul ca nu ai ajuns la ceva ce nu este atins de nicio regula din gramatica
>> si atunci e clar eroare de sintaxa, dar nici nu ai informatii suficiente
>> incat sa alegi una dintre cele 2.
> De ce poate face doar shift?
>
> Token-ul pe care îl analizez în momentul de față este un IDENTIFIER;
> lookahead-ul este "[". Eu vreau să accept atât [IDENTIFIER
> <arguments>] (forma prescurtată de dispatch), cât și <expr1>[<expr>,
> <expr>] (am pus <expr1> acolo pentru că poate nu are sens orice
> expresie să stea acolo; nu e chiar relevant aici, cred). Motivul,
> totuși, pentru care am <expr1> acolo e că vreau să accept și lucruri
> de genul [stack.pop][1,5], cum e chiar în exemplul de la vectori; de
> asemenea, un IDENTIFIER poate fi redus la <expr1>. Acum, conflictul e
> evident. Dacă fac shift, rămân cu IDENTIFIER pe stivă, la care
> parser-ul LALR nu se va mai întoarce să îl reducă eventual la <expr1>.
> Dacă fac reduce, e clar că opțiunea [IDENTIFIER <arguments>] pică,
> pentru că deja o să am pe stivă altceva decât IDENTIFIER.
>
>> in momentul in care ai "[a[1, 2]" sau "[a[foo]" pe stiva, poti sa decizi ca
>> pentru "a[1, 2]" faci reduce-ul la substring si pentru "[foo]" la dispatch.
>> Mai mult decat atat, exista un atom care diferentiaza clar regula pentru
>> substring, de regula dispatch. Nu-mi dau seama daca ar trebui sa ti-l zic eu
>> sau sa te las pe tine sa-l descoperi. :)
>>
>> O sa incerc ceva la mijloc si o sa te ajut cu un nou hint: Ce nu apare
>> intr-un dispatch, dar apare intr-un substring? Uita-te dupa '[', nu inainte.
>>
> E foarte evident lucrul acesta; nu asta era dilema.
>
> Scuze pentru insistență. Vreau, dacă e posibil, să mi se explice ce
> asum/înțeleg greșit.
>
> Mersi,
> Călin
> _______________________________________________
> cpl mailing list
> cpl at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/cpl
More information about the cpl
mailing list