eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingparsowanieRe: parsowanie
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
    From: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: parsowanie
    Date: Mon, 07 Feb 2011 23:30:31 +0100
    Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
    Lines: 70
    Message-ID: <o...@n...router>
    References: <z5amhr1xofpk$.14z5sesbluqtt$.dlg@40tude.net>
    NNTP-Posting-Host: 89-78-178-145.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=iso-8859-2; format=flowed; delsp=yes
    Content-Transfer-Encoding: Quoted-Printable
    X-Trace: inews.gazeta.pl 1297117827 19028 89.78.178.145 (7 Feb 2011 22:30:27 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Mon, 7 Feb 2011 22:30:27 +0000 (UTC)
    X-User: spoko_ws
    X-Antivirus: avast! (VPS 110207-0, 2011-02-07), Outbound message
    X-Antivirus-Status: Clean
    User-Agent: Opera Mail/11.01 (Win32)
    Xref: news-archive.icm.edu.pl pl.comp.programming:188681
    [ ukryj nagłówki ]

    Dnia 07-02-2011 o 21:23:26 Zbigniew Malec <a...@i...invalid>
    napisał(a):
    (...)

    W moim parserze wyrażeń matematycznych zastosowałem wariant ze wstępną
    (uproszczoną) analizą składniową. Fragment pliku wejściowego dla
    generatora tokenizera wygląda tak:

    # Stan 1 - Oczekiwanie na obiekt numeryczny

    1,integer->2=[0-9]+
    1,unaryoperator->1=(\-)|(\!)
    1,variable->2=[a-zA-Z][a-zA-Z0-9]*
    1,function->1=[a-zA-Z][a-zA-Z0-9]*\(
    1,openparenthesis->1=\(
    (...)

    # Stan 2 - Oczekiwanie na operator

    2,closeparenthesis->2=\)
    2,operator->1=(\+)|(\-)|(\*)|(\/)|(\\)|(\%)|(\^)|(\<
    \<)|(\>\>)|(\<)|(\>)|(\<\=)|(\>\=)|(\=\=)|(\!\=)|(\&
    )|(\|)|(\#)
    (...)

    Czyli na przykład f(x*(3+4)) zostanie rozpoznane jako:

    function, variable, operator, openparenthesis, integer, operator, integer,
    closeparenthesis, closeparenthesis.

    Analogicznie -2-3 jako:

    unaryoperator integer operator integer

    Moim zdaniem taka wstępna analiza składniowa jest bardzo wygodna, bo
    pozwala na wczesne wykrycie podstawowych błędów składniowych. Jeśli na
    przykład ktoś postawi operator binarny zaraz za nawiasem otwierającym -
    gdzie oczekiwany jest obiekt numeryczny - pierwszy zaprotestuje tokenizer,
    zgłaszając nie rozpoznany obiekt.

    Jest też minus tego rozwiązania: błąd zgłoszony użytkownikowi nie jest
    zbyt czytelny ("Nie rozpoznany token" lub "Nieprawidłowe wyrażenie" kontra
    "Nieoczekiwane wystąpienie operatora binarnego"). Wszystko jednak zależy
    od potrzeb :)

    Pozdrawiam -- Spook.

    --
    Używam klienta poczty Opera Mail: http://www.opera.com/mail/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: