🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #268086

Re: Ciemna strona C++

#268086
From: Sebastian Kaliszewski
Date: Fri, 14 Dec 2007 11:31
137 lines
4897 bytes
Seweryn Habdank-Wojewódzki wrote:
>>A co za problem? Te języki nie mają (poza C) ciężko chorej, kontekstowej
>>składni. 
> 
>>Parser robi się łatwo -- pół-mechanicznie przepisując publicznie 
>>dostępną gramatykę na źródło jakiegoś tam ANTLR-a
> 
> Tak.
>
> 
>>czy JavaCC czy co tam 
>>będzie wygodnego w używanym języku.
> 
> Hmm...

Co, hmm???


>>Potem tę przepisaną gramatykę nalezy 
>>ubrac w odpowiednie dla zastosowania akcje, ale parserem już jest to coś
>>bez akcji.
> 
> Super. A ja pisałem o samodzielnym pisaniu, a nie użyciu gotowców.

Jakich gotowców??? Wiesz co to jest ANTLR czy Yacc czy Bison czy Flex czy 
JavaCC?


> Dla
> mnie "Pisałem bezproblemowo" oznacza, że sam pisałem, a nie użyłem
> generatorów kodu.

A co za różnica? Po jaką cholerę się męczyć, jak można użyć właściwego 
narzędzia. Narzędzia, które odwali za mnie mechaniczną część roboty.

  Zamiast pisać


def parse(file):
   while not end(file):
     if lookup(file) == WHILE:
       parse_while(file)
     elif lookup(file) == IF:
       parse_if(file)
     elif lookup(file) == ID:
       parse_assign(file)
     else:
       raise ParseError, "Unknown instruction"
     if(lookup(file) == TERMINATOR:
       eat(file)
     else:
       raise ParseError, "; expected"

def parse_while(file):
   eat(file)
   parse_expression(file)
   if lookup(file) == BEGIN:
     parse(file)
     if(lookup(file) == END:
       eat(file)
     else:
       raise ParseError, "No matching end"
   else:
     raise ParseError, "Loop body must begin with begin"

def parse_if(file):
   eat(file)
   parse_expression(file)
   if lookup(file) == BEGIN:
     parse(file)
     if(lookup(file) == END:
       eat(file)
     else:
       raise ParseError, "No matching end"
   else:
     raise ParseError, "Conditional instruction body must begin with begin"
   if lookup(file) == ELSE:
     eat(file)
     if lookup(file) == BEGIN:
       parse(file)
       if(lookup(file) == END:
         eat(file)
       else:
         raise ParseError, "No matching end"
     else:
       raise ParseError, "Conditional instruction body must begin with begin"

def parse_assign(file):
   id = eat(file).value
   if lookup(file) != ASSIGN:
     raise ParseError, ":= expected"
   eat(file)
   parse_expression(file)

def parse_expression(file):
   if lookup(file) == NUMBER:
     num = eat(file).value
   elif lookup(file) == ID:
     id = eat(file).value
   if lookup(file) == MINUS:
     eat(file)
     parse_expression(file)



  Wolę napisać:


body: ((while | if | assign) TERMINATOR)*

while: WHILE expression BEGIN body END

if: IF expression BEGIN body END (ELSE BEGIN body END)?

assign: ID ASSIGN expression

expression: (NUMBER | ID)? (MINUS expression)?



Krócej a znaczy tyle samo. Logiki to za mnie nie rozwiąże, ale pisania dużo 
mniej, zapis czytelniejszy i trudniej o błąd.


>>Tak, pisałem przy użyciu ANTLR parser wcale nieprostego języka -- w
>>tydzień był gotowy :)
> 
> Super. Gratuluję umiejętności korzystania z "Worda". Co innego jest
> korzystanie z "Worda", a co innego jest napisanie "Worda". Ja też umiem
> kilkać GUI w Javie, a nie twierdze, że "bezproblemowo piszę".

Widzę, że nic a nic nie rozumiesz. Analogia kompletnie bez sensu.
Jak jesteś taki mądry to pisz w assemblerze -- po co ci jakiś język wyższego 
poziomu, przecież nie będziesz korzystał z gotowców...

pzdr
\SK
Technical Details
Message-ID: <fjtojr$qo1$1@bozon2.softax.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!bozon.softax.com.pl!not-for-mail
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgv318$hl7$1@bozon2.softax.pl> <fgv82j$htn$1@news.vectranet.pl> <fjncjm$ov6$1@inews.gazeta.pl> <fjpc4l$6ei$2@news.vectranet.pl> <fjrerb$8su$1@bozon2.softax.pl> <fjsa5u$qi$3@news.vectranet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!bozon.softax.com.pl!not-for-mail
From: Sebastian Kaliszewski <s@get.it.off.to.reply.informa.pl>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Fri, 14 Dec 2007 12:31:59 +0100
Organization: Softax news server
Lines: 137
Message-ID: <fjtojr$qo1$1@bozon2.softax.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgv318$hl7$1@bozon2.softax.pl> <fgv82j$htn$1@news.vectranet.pl> <fjncjm$ov6$1@inews.gazeta.pl> <fjpc4l$6ei$2@news.vectranet.pl> <fjrerb$8su$1@bozon2.softax.pl> <fjsa5u$qi$3@news.vectranet.pl>
NNTP-Posting-Host: 83.18.189.42
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1197631507 3772 83.18.189.42 (14 Dec 2007 11:25:07 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Fri, 14 Dec 2007 11:25:07 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050322)
X-Accept-Language: en-us, en
In-Reply-To: <fjsa5u$qi$3@news.vectranet.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit