2013-09-01 27 views
7

मैं पर्ल के लिए बहुत नया हूं और ऑपरेटर के साथ एक डोमेन विशिष्ट भाषा बनाना चाहता हूं जिसमें नई पर्ल 6 व्याकरण सुविधाओं का उपयोग करने की प्राथमिकता है। उदाहरण के लिए सही तरीके से "1 + 2 * 6" पार्स करने के लिए।ऑपरेटर प्राथमिकता नियमों के साथ पर्ल 6 व्याकरण का उदाहरण

अब तक जो दस्तावेज मैंने पाया है (उदा। this) को प्राथमिकता घोषणाओं के साथ ऑपरेटरों के व्याकरण नियमों के साथ उदाहरण नहीं मिला है।

मैं इस बहुत ही सरल उदाहरण

use v6; 

#use Grammar::Tracer; 

grammar TestGrammar { 

    token TOP { 
     <digit> <infix> <digit> 
    } 

    token infix:sym<times> is equiv(&infix:<*>) { <sym> } 

} 

sub MAIN() { 
    my $text = "1 times 2" ; 
    say $text ; 

    my $match = TestGrammar.parse($text); 
    say $match; 
} 

यह मैं

No such method 'infix' for invocant of type 'TestGrammar' 

मैं सिर्फ एक अमूर्त वाक्य रचना पेड़ का निर्माण करना चाहते हैं देता है।

उत्तर

5

AFAIK आप व्याकरण ऑपरेटरों को सेट नहीं कर सकते हैं और व्याकरण में प्राथमिकता आदि को परिभाषित नहीं कर सकते हैं। ये केवल वर्तमान में पर्ल 6

विस्तारित करने के लिए लागू हैं। यहां एक संभावित दृष्टिकोण है। यह जोड़ों से पहले गुणात्मक शब्दों को पार करता है और शब्दों या प्रतीकों को भी अनुमति देता है, उदा। times या *

use v6; 

grammar TestGrammar { 

    rule TOP  { <expr=.add> } 

    rule add  { <expr=.multiply> +% [ <add-op> ] } 
    rule multiply { <digit> +% [ <mult-op> ] } 

    proto token mult-op {*} 
    token mult-op:sym<times> { <sym>|'*' } 
    token mult-op:sym<divided> { <sym>|'/' } 

    proto token add-op {*} 
    token add-op:sym<plus>  { <sym>|'+' } 
    token add-op:sym<minus> { <sym>|'-' } 

} 

sub MAIN() { 
    for ("2+2", "2 + 2", "1 * 2", "1 + 2 * 6", "4 times 7 minus 3") { 
     say $_; 
     my $match = TestGrammar.parse($_); 
     say $match; 
    } 
} 

ध्यान दें कि % विभाजक ऑपरेटर है। <digit> +% [ <mult-op> ] का मतलब गुणात्मक ऑपरेटरों द्वारा अलग अंकों की एक सूची है (times, *, divided या /)।

वैकल्पिक समाधान सितं, 2014:

S05 उल्लेख करता है कि हालांकि नियमों और टोकन विशेष तरीके हैं, दोनों बहु के रूप में घोषित किया जा सकता है और बस नियमित तरीकों की तरह तर्क ले।

यह दृष्टिकोण ऑपरेटर प्राथमिकता स्तर को लागू करने के लिए दोनों रिकर्सन और बहु-प्रेषण का लाभ उठाता है।

use v6; 

grammar TestGrammar { 

    rule TOP    { <expr(3)> } 

    # operator multi-dispatch, loosest to tightest 
    multi token op(3) {'+'|'-'|add|minus} 
    multi token op(2) {'*'|'/'|times|divided} 
    multi token op(1) {'**'} 

    # expression multi-dispatch (recursive) 
    multi rule expr(0)  { <digit> | '(' ~ ')' <expr(3)> } 
    multi rule expr($pred) { <expr($pred-1)> +% [ <op($pred)> ] } 

} 

sub MAIN() { 
    for ("2+2", "2 + 2", "1 * 2", "1 + 2**3 * 6", "4 times (7 minus 3) * 3") { 
     say $_; 
     my $match = TestGrammar.parse($_); 
     say $match; 
    } 
} 
+0

हां, यह मानक दृष्टिकोण है जिसे मैं टालने की उम्मीद कर रहा था। अंत में मैं अपने कई ऑपरेटरों (पोस्टक्रिकमफिक्स, सूची, आदि) को परिभाषित करना चाहता था और सोचा था कि पर्ल इसे संभालेगा। क्या आपको पता है कि [तोते व्याकरण इंजन] (http://docs.parrot.org/parrot/latest/html/docs/book/pct/ch04_pge.pod.html) के बारे में भी यही सच है? – user2660278

+0

क्या पर्ल 6 से एचएलएल :: व्याकरण से व्याकरण प्राप्त होता है, जो आपको भी अनुकूल कर सकता है। आप पर्ल 6 आईआरसी पर पूछने का भी प्रयास कर सकते हैं - http://perl6.org/community/irc – dwarring

+1

अद्यतन: एनक्यूपी टूल-चेन का उपयोग करके एचएलएल और डोमेन विशिष्ट भाषाओं को लागू करने के लिए अब कुछ दस्तावेज और काम किए गए उदाहरण हैं! Http://edumentab.github.io/rakudo-and-nqp-internals-course/slides-day1.pdf देखें। काम किए गए उदाहरण पीपी 118 – dwarring

संबंधित मुद्दे