Inteligentny konwerter wyrażeń arytmetycznych

Transkrypt

Inteligentny konwerter wyrażeń arytmetycznych
Inteligentny konwerter wyrażeń
arytmetycznych
Łukasz Goszczyński
nr. albumu 113711
praca magisterska
wykonana pod kierunkiem dr hab. Stanisława Goldsteina prof. UŁ
Łódź 29 czerwca 2007
Spis treści
1 Wstęp
1.1 Cel, założenia i zakres pracy . . . . . . . . . . . . . . . . . . .
1.2 Zawartość pracy . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
4
2 Język XML
2.1 Aplikacja XML . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Poprawny i zwalidowany dokument XML . . . . . . . . . . .
2.3 Transformacje -XSLT . . . . . . . . . . . . . . . . . . . . . .
5
5
5
6
3 Język MathML
3.1 Dlaczego MathML? . . . . . . . . . . . . . . . . . . .
3.2 Przeglądarki obsługujące MathML-a . . . . . . . . .
3.2.1 Renderowanie MathML’a - Gecko . . . . . . .
3.3 Składnia MathML . . . . . . . . . . . . . . . . . . .
3.4 MathML a XML . . . . . . . . . . . . . . . . . . . .
3.5 Warstwy MathML . . . . . . . . . . . . . . . . . . .
3.5.1 Warstwa prezentacyjna . . . . . . . . . . . .
3.5.2 Warstwa znaczeniowa . . . . . . . . . . . .
3.6 Konwersja z warstwy znaczeniowej do prezentacyjnej
3.6.1 Konwersja za pomocą CSS . . . . . . . . . .
3.6.2 Konwersja za pomocą XSLT . . . . . . . . . .
3.7 TEX . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 Porównanie TEX-a i MathML-a . . . . . . . . . . .
3.9 Konwersja z TEXdo MathML . . . . . . . . . . . . .
3.10 Konwersja z MathML do TEX . . . . . . . . . . . . .
4 Konwersja wyrażeń arytmetycznych
4.1 Gramatyki i języki bezkontekstowe -wprowadzenie
4.1.1 Drzewa wyprowadzeń . . . . . . . . . . . .
4.1.2 Dwuznaczność gramatyki . . . . . . . . . .
4.1.3 Lewe i prawe wyprowadzenia . . . . . . . .
4.1.4 Sterowanie składnią . . . . . . . . . . . . .
4.2 Yacc- krótki opis . . . . . . . . . . . . . . . . . . .
4.3 Gramatyka wyrażeń arytmetycznych . . . . . . . .
4.3.1 Liczby . . . . . . . . . . . . . . . . . . . . .
4.3.2 Wyrażenia arytmetyczne . . . . . . . . . . .
4.3.3 Niejednoznaczność powody jej powstawania oraz eleminacja . .
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
9
9
10
11
11
12
13
14
14
15
15
16
16
16
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
17
18
18
19
19
19
20
20
21
. . . . . .
21
.
.
.
.
.
.
.
.
.
4.3.4
4.3.5
4.3.6
4.3.7
Łączność operatorów . . . . . . . . . . . . .
Priorytet operatorów . . . . . . . . . . . . .
Priorytety i łączność operatorów w Yacc-u .
Niejednoznaczności nie do uniknięcia . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
21
22
22
5 Opis programu
5.1 Rys techniczny programu . . . . . . . . . . . . . .
5.2 Interfejs użytkownika i wstępny analizator . . . . .
5.2.1 Moduł słownika . . . . . . . . . . . . . . . .
5.2.2 Moduł lexera . . . . . . . . . . . . . . . . .
5.2.3 Moduł parsera . . . . . . . . . . . . . . . .
5.3 Zaimplementowane algorytmy . . . . . . . . . . . .
5.3.1 Znajdowanie ułamków niewłaściwych . . . .
5.3.2 Sprawdzanie poprawnośći ułamka . . . . . .
5.3.3 Drzewo wyrażenia a atrybuty syntezowane .
5.4 Generowanie drzewa wyrażenia . . . . . . . . . . .
5.5 Generowanie MathML . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
23
23
24
25
26
26
26
27
27
27
A Schemat IKWA
29
B Gramatyka Wyrażeń Arytmetycznych
30
C Przykładowy dok. TEXdo konwersji na MathML
.
31
3
1
Wstęp
1.1
Cel, założenia i zakres pracy
1.2
Zawartość pracy
Niniejsza praca podzielona jest na cztery częśći. Starałem się by tematy w nich omawiane były ułożone w sposów logiczny. Najpierw omawiam
temat od strony teoretycznej a póżniej popieram go praktycznymi przykładami. W pierwszej przedstawiam teoretyczne podstawy XML, przydatne
do dalszych rozważań. W drugiej częśći omawiam język MathML. W trzeciej części przedstawiłem skontruowaną przeze mnie ”Gramatykę Wyrażeń
Arytmetycznych” (dalej nazywaną w skrócie GWA). Opis gramatyki jest
poprzedzony teoretycznym wprowadzeniem do tematu gramatyk bezkontekstowych. W czwartej, ostatniej częsći przedstawiam ”Inteligentny Konwerter
Wyrażeń Matematycznych” (dalej nazywany w skrócie IKWA). Trzy pierwsze rozdziały przygotowują niejako grunt pod rozdział czwarty. Program
ten produkuje bowiem na wyjściu kod MathML i wykorzystuje uprzednio
opisaną gramatykę bezkontekstową.
4
2
Język XML
Niniejszy rozdział ma służyć jako wprowadzanie do XML-a. Objaśnię w
nim technologie wykorzystywane w dalszej części pracy.
XML(ang. eXtensible Markup Language) to język znacznikowy ułatwiający przechowywanie i wymianę danych. XML sam w sobie nie jest aplikacją .
Pozwala jedynie na przejrzysty i oszczędny (w sensie zużytego miejsca) zapis
informacji. Dodatkową cechą dokumentów XML jest łatwość ich przetwarzania.
Dokumenty XML składają się z dwóch rodzajów tzw. elementów. Elementy
treściowie to znacznik otwierający, znacznik zamykający i zawarta między
nimi treści. (znaczniki są zawsze ogranicznone ostrymi nawiasami <>). Elementy treściowe mogą zawierać pod-elementy itd.
<znacznik> treść </znacznik>
Elementy powinny z zasady być pisane małymi literami.
Oprócz tego istnieją elementy puste nie zawierające treści. Elementy puste
składają się z pojedyńczego znacznika zakończonego slash’em.
<znacznik/>
Poszczególne elementy dostarczają informacji pomocnych przy procesie przetwarzania. Całość dokumentu musi zawierać się w pojedyńczym elemenciekorzeniu. Oprócz tego na samym początku powien się znajdować nagłówek
informujący o wersji XML-a i o użytym kodowaniu znaków, np:
<?xml version="1.0" encoding="UTF-8">
2.1
Aplikacja XML
Aplikacja XML to zastosowanie języka XML do jakiejś dziedziny. Nie
należy rozumieć terminu ”aplikacja” w sensie potocznym. Aplikacja XML
nie jest programem. Przykładem aplikacji XML jest języm MathML opisany
w dalszej części pracy.
2.2
Poprawny i zwalidowany dokument XML
Każdy dokument XML musi być poprawnie sformułowamy. Każdy znacznik musi mieć odpowiedni znacznik zamykający (nie dotyczy el. pustych).
Znaczniki muszą być zagnieżdżone w sposób prawidłowy. Niedopuszczalna
5
jest sytuacja gdy znaczniki są zamykane w innej kolejności niż były otwierane. Np. zapis "<b><i>text</i></b>" spowoduje błąd. Podobna sytacja
byłaby dopuszczalna w dok. HTML gdyż przeglądarki są na ogół odporne
na takie nieprawidłowośći. Autorzy XML’a chcieli jednakże żeby konstrukcja parserów dla tego języka była w miarę prosta. Poprawnie sformułowany
dok. XML zwalnia programistę parsera od konieczności obsługiwania ew.
błedów składniowych. 1
Natomiast jeśli plik XML jest zwalidowany oznacza to że spełnia on
normy wyszczególniowe w tzw. DTD (Definicji Typu Dokumentu). DTD
opisuje w sposób formalny strukturę dokumentów XML (ale także HTML
i XHTML). Definiuje jakie znaczniki mogą być użyte, jakie mogą posiadać
atrubuty itd.
Drugim standardem definiowania struktury dokumentu jest XML Schema. Uważane jest ono za następcę DTD ze względu na znacznie większe
możliwości. XMLS jest aplikacją XML w odróżnieniu od DTD. W dalszej
cześci pracy będę korzystał właśnie z tego standardu.
2.3
Transformacje -XSLT
XSLT (ang. eXtensible Stylesheet Language Transformations) to oparty na XML2 język do transformacji dokumentów XML-owych. Arkusz XSLT
zawiera informacje na temat sposobu przetwarzania konkretnych elementów
wyjściowego XML-a. Instrukcje z arkusza są interpretowane przez procesor
XSLT .
XSLT został opracowany przez W3C i stanowi część rodziny języków nazwanej XSL. Arkusze XSLT są poprawnymi dokumentami XML. Pierwotnie celem XSLT była konwersja plików XML-z jednego formatu to drugiego.
Ale o wiele ciekawsze możliwości daje przekształcanie na inne formaty. Np.
HTML,XHTML,PDF. Takie dokumenty mogą być następnie wyświetlane
w przeglądarkach. Dla przykładu rozważmy elementarny problem, związany z częścią mojego programu- modułem słownika. Słownik pobierając ciąg
wyrazów na wejściu produkuje plik xml-owy zawierający dane o formie gramatycznej poszczególnych słów.
...
<equation>
...
1
Dokument HTML będący poprawnie sformułowanym dok. XML-owym to tzw. plik
XHTML
2
Arkusze XSLT są poprawnymi dokumentami XML!
6
Rysunek 1: XSLT
<token>
<czesc\_mowy>rzeczownik</czesc\_mowy>
<rodzaj>r.z.</rodzaj>
<liczba>l.poj.</liczba>
<przypadek>dop</przypadek>
<temat>poteg</temat>
<koncowka>i</koncowka>
<text>potegi</text>
<forma\_podstawowa>potega</forma\_podstawowa>
</token>
...
</equation>
...
Chcielibyśmy wyświetlić te dane w przejrzystej formie, np tabeli. Plik html
powinien wyglądać następująco:
...
<tr align="center">
<td><b>potegi</b></td>
<td>rzeczownik</td>
7
<td>r.z.</td>
<td>l.poj.</td>
<td>dop</td>
<td>poteg</td>
<td>i</td>
<td>potega</td>
</tr>
...
Żeby tego dokonać tworzymy arkusz XSLT -style.xsl. 3 Definiujemy w nim
akcje jakie mają zostać podjęte po napotkamiu odpowiednich znaczników.
Chcielibyćmy żeby po napotkaniu elementu ”equation” wygenerowany został
szkielelet dokumentu html.
<xsl:template match="equation">
<html>
<body>
<xsl:apply-templates select="token"/>
</body>
</html>
</xsl:template>
Zauważmy że w ciele dokumentu została wstawiona dyrektywa apply-template.
W tym miejscu zostanie wstawione dane o poszczególnych wyrazach.
Całość dokumentu należy ująć w znaczniki:
<xsl:stylesheet version="1.0">
<xsl:output method="html" indent="no" encoding="utf-8"/>
...
</xsl:stylesheet>
Obecnie procesory XSLT są wbudowane w przeglądarki internetowe. Żeby
obejrzeć efekt naszej pracy trzeba dodać wpis w pliku osoby.xml:
<?XML-stylesheet href="style.xsl"
type="text/xsl"?>
i otworzyć dokument w przeglądarce. Arkusz zostanie automatycznie zaaplikowany.
3
plik arkusza w załączniku
8
3
Język MathML
MathML (ang. Mathematical Markup Language) jest dziełem organizacji W3C. Ta XML-owa aplikacja pozwala na łatwe przedstawienie skomplikowanych wyrażeń matematycznych. Zaletą MathML’a jest możliwość
oglądania go w przeglądarkach internetowych. Co więcej można w nim zdefiniować nie tylko ”zawartość” ale także strukturę. Treści zapisane w ten
sposób mogą być w łatwy sposób interpretowane przez inne aplikacje. Żródła MatmML-owe mogą być dołaczane do dokumentu HTML. Rozszerza to
znakomicie możliwości prezentacji matematycznych w sieci.
3.1
Dlaczego MathML?
Powstało wiele języków umożliwiających zapisywanie wyrażeń matematycznych. Zasadniczo można podzielić je na dwie grupy. Języki pierwszego typu
pozwalają na zdefiniowanie wzoru i wyrenderowanie go. Przykładem może
być Tex. Wadą jest tu niemożność dalszej obróbki. Wyrażenie istnieje w
postaci graficznej, nie można go sparsować. Drugą grupę stanowią języki
umożliwiające operacje matematyczne. Jednak wprowadzony wzór jest nieprzejrzysty dla czytającego. Nie mówiąc już o braku ew. symboli matematycznych.Autorom przyświecała idea połączenia zalet obu grup. Miał być to
język o przejrzystym, jednoznacznym sposobie zapisu. Do tego umożliwiający renderowanie wzorów. Źródło MathML’a może być oglądane i kopiowane
co także jest poważnym plusem w porównaniu do Tex’a.
3.2
Przeglądarki obsługujące MathML-a
Obecnie niewiele przeglądarek potrafi renderować MathML-a. W dodatku żadna nie obsługuje warstwy treściowej. Niektóre, jak Internet Explorer,
wymagają dodatkowych wtyczek. Jest to jednak mało wygodne rozwiązanie.
gdyż pociąga to za sobą konieczność modyfikowanie treści dokumentu. W
szczególności stosowania dodatkowych znaczników.
3.2.1
Renderowanie MathML’a - Gecko
Gecko to silnik graficzny do wyświetlania stron internetowych. Pozwala na parsowanie i renderowanie dokumentów rozmaitych formatów. M.in.
DOM, XML, XHTML, Javascript, RDF. Stworzony przez Nestcape Communications Corporation na potrzeby przeglądarek Nestcape 6.x i Mozilla
Suite. Jest wykorzystywany głównie w przeglądarkach firmy Mozilla: Firefox, Sea Monkey. Te przeglądarki są w stanie renderować dokumenty Ma9
thML. Innym rozwiązaniem jest stosowanie arkuszy stylów, pod warunkiem
że przeglądarka obsługuje XSLT, co także nie jest regułą.
Mozilla Firefox- chociaż posiada natywną obsługę MathML-a, jego użycie obwarowane jest kilkoma ograniczeniami. Firefox nie zezwala na wbudowywanie MathML-a w dokumenty HTML. Dla poprawego wyświetlania
znaczniki MathML-owe muszą być dołączone do pliku XHTML. XHTML to
HTML przedefiniowany zgodnie z regułami XML. W dokumencie XHTML
:
- wszystkie znaczniki muszą być pisane małymi literami,tak więc akceptowany
- wszystkie niepuste elementy puste muszą zawierać znacznik zamykający,
- wszystkie elementy puste muszą zawierać slash’a
- elementy muszą być prawidłowo zagnieżdzone:
- atrybuty elementów muszą być ujęte w cydzysłowy,
- element ”html” musi mieć wyspecyfikowany atrybut xlmns:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
Netscape (8.1) Obsługuje zarówno warstwę prezentacyjną jak i XSLT.
Opera (9.0) Nie obsługuje ani warstwy prezentacyjnej ani XSLT.
Internet Explorer 9.0 Obecnie nie posiada natywnej obsługi MathML. Jednak od wersji 6.0 możliwe jest zastosowanie arkuszy stylów. Innym wyjściem
jest zainstalowanie Techexplorer-a. Jest to dodatkowa wtyczka do renderowania Texa, Latexa i MAthmML.
3.3
Składnia MathML
Idea opisu wzorów matematycznych opiera się na kilku spostrzeżeniach. Wyrażenie matematyczne można w opisać w wygodny sposób korzystając z rekurencji.
Weźmy na przykład wytażenie : (x + 4)y+5
(x + 4)y+5
x + 4D
x
zz
zz
z
zz
|z
z
RRR
RRR
RRR
RRR
RR)
lll
lll
l
l
lll
u ll
l
DD
DD
DD
DD
"
y
4
rys. Pudełka
10
y + 5D
zz
zz
z
z
z} z
DD
DD
DD
D!
5
3.4
MathML a XML
Dokument MathML jest zarazem poprawnym dokumentem XML-owym.
Oznacza to że wszelkie reguły obowiązujące w XML muszą byc stosowane
w dok. MathML. Każda instancja(?) MathML to zbiór zagnieżdzonych w
sobie elementów. Dzielą się one na dwa rodzaje- ”kontenery” i el.”puste”.
Kontenery składają się ze znacznika otwierającego, znacznika zamykającego
i treści zawartej między nimi:
<znacznik>treść</znacznik>
Elementy puste nie zawierają żadnej treści. Zwyczajowo zamiast znacznika otwierającego i zamykającego wystarczy użyc tylko tego drugiego.
<znacznik/>
Oprócz wspomnianych reguł standard MathML definiuje kilka dodatkowych zasad. Można je zasadniczo podzielić na dwa typy:
-ograniczenie co do typu atrybutów
-ograniczenia co do ilości elementów potomnych
Zasady te nie są wyszczegółowione w MathML DTD i procesor nie wychwyci
żadnych błędów w przypadku ich złamania. Stanie się to dopiero podczas
parsowania dokumentu w przeglądarce czy innej aplikacji obsługującej.
3.5
Warstwy MathML
Wzór matematyczny jako taki mieści w sobie wiele, często dwuznacznych informacji. W zależności od przyjętego kontekstu to samo wyrażenie
może być onterpretowane na kilka sposobów. Litery ”ax” to albo iloczyn
dwóch zmiennych a i b albo nazwa jednej zmiennej. Postać graficzna niesie
zbyt mało informacji by to stwierdzić. Z drugiej strony to samo wyrażenie
matematyczne można zapisać w kilku postaciach. Przykladowo (tu wstawić
całki) to dwa oznaczenia na pierwszą pochodną funkcji f.
Przydatny w takiej sytuacji byłbby jednoznaczny sposób na zdefiniowanie zarówno formy graficznej jak i informacji zawartej w wyrażeniu. W tym
celu MathML dostarcza dwa niezależne zestawy znaczników:
-znaczniki prezentacyne (”prezentation markups”);
-znaczniki treściowe (”content markups”)
Znaczniki prezentacyjne odpowiadają za formę graficzną. Znaczniki treściowe kodują znaczenie symboliczne. Wyrażenie matematyczne może byc
zdefiniowane za pomocą jednej lub drugiej grupy bądź kombinacji tagów z
obu grup,
11
3.5.1
Warstwa prezentacyjna
Elementy warstwy prezentacyjne mają za zadanie opisanie struktury
wzory matematycznego od strpny wizualnej. Jak było wspomniane wcześniej, w tradycyjnej notacji matematycznej wyrażenia matematyczne są kontruowane z mniejszych podwyrażeń. Podwyrażenia z kolei powstają z pojedyńczych symboli. Między poszczególnymi podwyrażeniami określone są wzajemne zależności. Informacji o tych współzależnościach dostarcza warstwa
prezentacyjna.
Na początek przedstawię kilka przykładowych elementów a następnie
pokażę jak skontruować z nich proste wyrażenie.
mi - identyfikator. Nazwy identyfikatorów mogą zawierać zmienne nazwy
funkcji i stałych.
mn - literał numeryczny lub inny łańcuch, który powinien być renderowant
jak identyfikator
mo
- operator, nawias lub separator
mrow -grupuje pojedyńcze elementy (lub zbiory elementów) w większe
całości.
Prezentując przykładowe elementy warstwy prezentacyjnej należy zauwazyć że w jej kontekście procesor MathML nie dokonuje żadnego sprawdzania typów. Tak więc możemy np. dowolny łańcuch znaków przedstawić
jako liczbę:
<mn> literał </mn>
I nie spowoduje to żadnego błędu. Jest to o tyle logiczne, że warstwa tekstowa
ma jedynie dostarczać informacji o sposobie renderowania wzoru.
Korzystając z przedstawionych elementów dokonajmy konstrukcji przykładowego wyrażenia: (x + 4)y+5
<mrow>
<msup>
<mfenced>
<mi>x</mi>
<mo>+</mo>
<mi>4</mi>
</mfenced>
<mfenced>
<mi>y</mi>
<mo>+</mo>
12
<mn>5</mn>
</mfenced>
</msup>
</mrow>
3.5.2
Warstwa znaczeniowa
Na elementy warstwy treściowej składają się następujące typy elementów:
Tokeny - ch,ci,csymbol. Dwa pierwsze mają swoje odpowiedniki w warstwie prezentacyjnej (mn i mi). El. csymbol pozwala na przypisanie szczególnego znaczenia danemu symbolowi matematycznemu. Tokeny są jedynymi
elementami zawierającymi treść.
Konstruktory -służą do organizowania elementów (operatorów,funkcji,
zmiennych) w większe bloki składniowe a także do konstruowania złożonych
obiektów jak zbiory, macierze czy wektory. Najważniejszym elementem z tej
grupy jest apply służący do przekazywania argumentów dla funkcji:
<apply>
<nazwa_funkcji/>
argument1
argument2
</apply>
Funkcje i operatory -są to elementy puste. Można je podzielić ze względu
na działy matematyki jakich się tyczą. Przykładowo na znaczniki algebraiczne, logiczne czy teorii zbiorów.
Kwalifikatory Dostarczarczają dodatkowych informacji niezbędnych do
precyzyjnego określenia znaczenia innych elementów.
<apply>
<int/>
<bvar>
<ci> x </ci>
</bvar>
<lowlimit>
<cn> 0 </cn>
</lowlimit>
<uplimit>
<ci> a </ci>
</uplimit>
</apply>
13
Przykładowe wyrażenie opisane za pomocą znaczników warstwy treściowej:
<apply>
<power/>
<apply>
<plus/>
<ci>x</ci>
<cn>4</cn>
</apply>
<apply>
<plus/>
<ci>y</ci>
<cn>5</cn>
</apply>
</apply>
3.6
3.6.1
Konwersja z warstwy znaczeniowej do prezentacyjnej
Konwersja za pomocą CSS
CSS (Cascade Style Sheets) to najszerzej wykorzystywany sposób na
określenie graficznych cech dokumentu HTML(XHTML). Arkusz stylów może być wbudowany w sam dokument albo stanowić odrębną calość. Składa
się ze zbioru regół w formie:
selektor { atrybut1:parametr1; atrybut2:parametr2 ...}
Selektorem może być nazwa elementu np ”a” (odsyłacz), ”p”(paragraf),
”h1”(nagłówek). Przykładowo wpis:
h1 {color:red}
określa, że nagłówek będzie pisany czerwoną czcionką.
Przy publikowaniu dokumentu CSS pozwala w łatwy i przejrzysty sposób
kontrolować jego wygląd. Można w ten sposób wpływać na atrubuty czcionki
ale także kolor tła, wyrównanie tekstu itp. Także do wyświetlania treści
matematycznych można stosować ten machanizm. Zamiast stosować lokalnie
znaczniki ”<mamthstyle>” należący do warstwy prezentacyjnej definiujemy
pewne cechy globalnie.
Arkusze CSS są bardzo potężnym narzędziem. Ich możliwości nie ograniczają się tylko do ustawiania takich opcji jak wygląd tekstu. Arkusz stylów
14
do konwersji z warstwy prezentacyjnej do znaczeniowej można sciągnąć z
internetu. 4
3.6.2
Konwersja za pomocą XSLT
Arkusz stylów MAthML dostarcza informacji o tym jak przekształcić
treść dokumentu tak by można go było poprawnie wyświetlić w przeglądarce. Najpierw sprawdzany jest rodzaj używanej przeglądarki i czy ma ona
wbudowaną obsługę MathML-a. Jeśli tak, arkusz kończy swoją pracę i w
wykorzystywane są natywne możliwości przeglądarki. W przeciwnym wypadku, jeśli nie jest możliwe renderowanie dokumentu bezpośrednio przez
aplikację, szukane są ewentualne wtyczki MAthML-owe. Jeśli i tych nie ma
- arkusz renderuje dokument przy wykorzystaniu CSS i Javascript.
Dodatkową ważną funkcjonalnością arkusza jest możliwość wyświetlania
znaczników warstwy treściowej, na przeglądarkach które nie są w stanie ich
odpowiednio zinterpretować (Amaya, Mozilla). Wszystkie elementy warstwy
treściowej są konwertowane na odpowiadające im elementy warstwy prezentacyjnej. Te z kolei mogą już być łatwo wyrenderowane.
Uniwersalny arkusz stylów MathML składa się z czterech części:
mathml.xsl -wywoływany w pierwszej kolejności. Wykrywa jakiej przeglądarki używamy i czy nie są zainstalowane dodatkowe wtyczki.
pmathml.xsl -jak wyżej, z tym że nie wywołuje arkusza ctop.xsl(patrz
niżej)
ctop.xsl -konwertuje zawartość z warstwy znaczeniowej na warstwę prezentacyjną
pmathmlcss.xsl -dokonuje transformacji warstwy prezentacyjnej na XHTML
przy użyciu CSS i Javascript
3.7
TEX
TeX to system do profesjonalnego składania dokumentów. TeX to zarówno język jak i kompilator. Twórca TeX’a -Donald E. Knuth, stworzył go
z myślą o renderowaniu skomplikonych wzorów matematycznych. Obecnie
system jest niezwykle popularny.
4
http://math.nist.gov/∼ BMiller/mathml-css/
15
3.8
Porównanie TEX-a i MathML-a
W załączniku do mojej pracy przedtawiłem sposób zapisu tych samych
wzorów za pomocą TEX-a i MathML-a. Załącznik jest dokumentem xhtmlowym, w związku poleca się jego otwarcie np. w Firefoxie.
3.9
Konwersja z TEXdo MathML
Plecam konwerter online :
http://hutchinson.belmont.ma.us/tth/mml/ttmmozform.html W załączniku do pracy przykładowy dokument w TEXi wygenerowany na jego podstawie dokument MathML. Konwerter dobrze radzi sobie z trybem matematycznym jednakże ma problemy z konwersją całych dokumentów.
3.10
Konwersja z MathML do TEX
Dla konwersji najlepiej użyć arkuszy stylów lub konwertera online, korzystającego właśnie z tych arkuszy. Szablony kowersji elementów, układu
graficznego i tabelek znajdują się w sześćiu odzdzielnych arkuszach. Arkusze
stylów są do ściągnięcia z internetu 5
5
http://raleigh.ru/MathML/mmltex.
16
4
Konwersja wyrażeń arytmetycznych
Na początku przypomnę teoretyczne podstawy gramatyk bezkontekstowych. Następnie przestawię pokrótce narzędzia programistyczne z których
korzystałem. Dalsza część rozdziału opisuje stworzoną przeze mnie Gramatykę Wyrażeń Arytmetycznych (w skrócie GWA).
4.1
Gramatyki i języki bezkontekstowe -wprowadzenie
W sensie użytkowym gramatyka bezkontekstowa pozwala na zdefiniowanie składni pewnego języka. Na potrzeby niniejszej pracy wykorzystam pewną klasę gramatyk formalnych zwanych bezkontekstowymi. Formalnie gramatyka bezkontekstowa to pewna czwórka uporządkowana (T,N,P,S) gdzie:
T-skończony zbiór symboli terminalnych (w skrócie terminale),
N-skończony zbiór symboli nieterminalnych (w skrócie nieterminale),
S-pewnien symbol nieterminalny zwany startowym
P-skończony zbiór produkcji
Symbole terminalne to symbole podstawowe tworzące większe całości zwane
napisami. Nieterminale to zmienne opisujące zbiory napisów. Symbol startowy jest szczsgólnym przypadkiem nieterminala. Produkcje określają w jaki
sposób terminale i nieterminale mogą być łączone w napisy. Są to reguły
typu L → R, gdzie L jest pewnym symbolem nieterminalnym a R napisem
złożonym z terminali i nieterminali.
Każda gramatyka bezkontekstowa generuje pewien zbiór słów, zwany
językiem bezkonteksotwym.Dla przykładu rozważmy prostą gramatykę bezkontekstową generująca język palindromy. Mamy dany zbiór symboli terminalnych a,b, zbiór symboli nieterminalnych S, element początkowy S oraz
następujące reguły produkcji: {S → aSa|bSa|a|b| 3} Weźmy przykładowo
słowo ”ababa”. Jest ono palindromem, a zatem jest generowane przez język palindromy. Zaczynając od symbolu startowego, stosując odpowiednie
produkcje mamy:
S → aSa
aSa → abSba
abSba → ababa
17
4.1.1
Drzewa wyprowadzeń
Definiowanie języka za pomocą gramatyki można ilustrować w bardziej
oberazowy sposób, wykorzystując model drzewa. Załóżmy że symbol starowy
jest korzeniem drzewa. Każdy węzeł wewnętrzny drzewa reprezentuje pewien
nieterminal. Jego dzieci to symbole z prawej strony produkcji. Liście drzewa
wyprowadzenia będą reprezentowały pewne nieterminale.
Drzewo będzie przedstawiało graficznie pewne wyprowadzenie, przy pominiętej informacji o kolejności zamian. Dla słowa ”ababa” będzie miało ono
następującą postać:
p S NNNN
NNN
ppp
p
p
NNN
pp
p
NNN
p
p
N'
w pp
p
a
a
S>
>>
>>
>>
>
S
b
b
a
4.1.2
Dwuznaczność gramatyki
Jeżeli dla danego słowa można zbudować więcej niż jedno drzewo wyprowadzenia to taka gramatyka nazywana jest dwuznaczną. Rozważmy gramatykę o następujących regułach produkcji:
S → AA
A → x|xx
Dla słowa ”aaa” możliwe jest skonstruowanie dwóch różnych drzew wyprowadzeń:
A
x





S?
?
??
??
?
x
~~
~~
~
~~
~
A@
@@
@@
@@
x
x
18



 
A@
@@
~~
@@
~~
@@
~
~ ~
S?
?
??
??
?
x
A
x
Problem dwuznaczności gramatyki będzie poruszamy w dalszej części mojej
pracy.
4.1.3
Lewe i prawe wyprowadzenia
Dokonując kolejnych wyprowadzeń, możemy natknąć się na problem jakiej produkcji użyć w danym momencie. Weźmy przykładową gramatykę:
S → AB
A → Ax|y
B→z
Dla słowa ”yz” mamy dwa możliwe ciągi wyprowadzeń: S → AB, A → y,
B → z lub S → AB, B → z, A → y . Zauważmy przy tym że drzewo wyprowadzenia będzie w obu przypadkach wyglądało tak samo. Tak więc nie
mamy tu do czynienia z dwuznacznością gramatyki. Jednak dla wygody dobrze byłoby określić z których produkcji należy korzystać. Jeżeli założymy
że w pierwszej kolejności dokonujemy produkcji dla skrajnego lewego nieterminala to mówimy o lewych wyprowadzeniach. Jeśli natomias rozwijamy
skrajny prawy terminal- o prawych wyprowadzeniach.
4.1.4
Sterowanie składnią
Dla uproszczenia gramatyki możemy każdemy symbolowi przypisać pewien zbiór wartości zwanych atrybutami.
liczba_jednocyfrowa : jeden
dwa
...
dziewięć
4.2
{wartość=1;}
{wartość=2;}
{wartość=9;}
Yacc- krótki opis
Yacc jest generatorem analizatorów typu LR(n). L (”leftmost”) oznacza przeglądanie wejścia od lewej strony. R (”rightmost”) oznacza budowę od
końca prawostronnego wyprowadzenia. Liczba n określa maksymalną liczbę
tokenów jaką można podejrzeć przed podjęciem decyzji shift/reduce. Dla
Yacc’a w szczególności n=1.
Analizatory LR akceptują większość języków bezkontekstowych. Są wydajne i przewidywalne jezeli chodzi o czas analizy danego wejścia. Dzieje sią
tak gdy używają metody nienawracającej.
19
4.3
Gramatyka wyrażeń arytmetycznych
W tej części pracy opiszę teoretyczną podstawę moich działań. Postaram się uzasadnić że Gramatyka Wyrażeń Arytmetycznych (GWA) jest
gramatyką bezkontesktową. Dla uproszczenia przyjmuję następującą konwencję nazewniczą: Gramatyka Wyrażeń Arytmetycznych - w skrócie GWA
4.3.1
Liczby
W toku analizy bottom-up tworzone są najpierw podrzewa odpowiadające poszczególnym elementom. W szczególności najpierw powstają podrzewa
liczb podpinane następnie do drzewa całego wyrażenia. Przykładowo podrzewo dla liczby ”121” wygląda następująco:
Ważne jest wyliczenie watrubutu wartośći liczby. Jest on wylicznany na
podstawie wartości poszczególnych cyfr.Przykładowo podrzewo dla liczby
”121” wygląda następująco:
cala liczba
val:121
liczba trzycyfrowa
val:121
ppp
p
p
ppp
wppp
grupa 3A
liczba dwucyfrowa
val:100
val:21
QQQ
QQQ
QQQ
QQQ
Q(
grupa 2B
liczba jednocyfrowa
”sto”
val:20
val:1
”dwadziescia”
grupa 1A
val:1
”jeden”
Na podstawie tokenów wyliczane są odpowiadające im wartości. Początkowo samo rozpoznanie tokena nie daje informacji o pozycji cyfry. Dopiero
w momencie gdy cyfry łączą się w liczby można dokonać wyliczenia jej wartości.
20
4.3.2
Wyrażenia arytmetyczne
4 + x ∗ 5 UU
4
lll
lll
l
l
ll
lll
u ll
l
”+”
UUUU
UUUU
UUUU
UUUU
*
x
liczba
x ∗ 5I
II
uu
II
u
uu
II
u
u
II
u
u
I$
uz
”∗”
liczba
4.3.3
5
liczba
Niejednoznaczność powody jej powstawania oraz eleminacja
W tym podrozdziale przedstawię aspekty powodujące niejednoznacznośc
grmatyki oraz sposoby na wyeliminowanie tejże niejednoznaczności.
4.3.4
Łączność operatorów
Zauważmy że podana na wejście fraza ”dwa dodać trzy dodać cztery”
domyslnie oznacza tyle co (2+3)+4. Po obu stronach argumentu ”trzy” wystepują operatory. Trzeba ustalić którego operatora dotyczy ten argument.
Jeśli przyjmiemy że argument będzie służył do wyliczenia lewego operatora
to operator dodawania będzie tzw. łączny lewstronnie. Jeżeli argument posłuży do wyliczenia prawego operatora - operator będzie łączny prawostronnie. Ogólnie łączne lewostronie będą operatory dodawania, odejmowania,
mnożenia i dzielenia. Natomiast łaczne prawostronnie będą operatory potęgowania. Łącznośc operatorów jest łatwa do zaobserwowania gdy spojrzymy
na drzewo wyprowadzenia. Dla operatorów łącznych lewostronnie drzewo
będzie rosło w dół w prawo. Dla operatorów łącznych prawostronnie - w dół
w lewo.
4.3.5
Priorytet operatorów
W pewnych sytuacjach zdefiniowania łączności operatorów nie jest wystarczającym kryterium do jednoznaczenego rozstrzygnięcia jak zbudować
dzrzewo wyprowadzenia. Weźmy frazę ”dwa dodać trzy razy cztery. Możemy ją interpretować dwojako: (2 + 3) ∗ 4 lub 2 + (3 + 4). Do podjęcia decyzji
konieczne jest zdefiniowanie prioeytetu (pierwszeństwa) operatorów. W tej
21
sytuacji chcielibyśmy żeby wyższy priorytet miał operator mnożenia. Oznacza to że operację mnożenia należy wykonać przed operacją dodawania. W
GWA priorytety opratorów przedstawiają się następująco:
4.3.6
Priorytety i łączność operatorów w Yacc-u
O priorytecie operatorów decyduje kolejnośc deklaracaji. Pierwszy zadeklarowany operator będzie miał największy priorytet. Łącznośc operatorów
definiujemy następująco:
%left nazwa operatora
Operatory ’+’ i ’-’ będą miały ten sam priotrytet i będą lewostronnie łączne.
4.3.7
Niejednoznaczności nie do uniknięcia
GWA posiada pewną liczbę niejednoznaczności. Są to konflikty shift/reduce.
Sugeruje to iż nie jest ona typu LR(1). Tylko takie gramatyki są bowiem
akceptowane przez Yacc’a. Z technicznego punktu widzenia zawartośc stosu
i kolejny symbol z wejścia nie wystarczają do zdecydowania jakiej produkcji
użyć. Dzieje się tak gdy prawa strona produkcji zawiera dwa sąsiadujące
nieterminale. Odnosi się to do częśi GWA generującej liczby naturalne.
Jeżeli w gramatyce wystąpi konflikt shift/reduce analizator wykona przesunięcie(?).
22
5
Opis programu
W tym rozdziale dokonam opisu stworzonego przeze mnie programu i
jego funkcjonalności.
5.1
Rys techniczny programu
Dla uproszczenia konwertera starałem się doprowadzić do jego jak największej modularyzacji. Program 6 jest podzielony na cztery niezależne logicznie części. Przedstawię pokrótce każdą z nich.
5.2
Interfejs użytkownika i wstępny analizator
Interfejs użytkownika jest napisany w PHP. Pozwala to na dostęp do programu przez przeglądarkę internetową. Istotne jest przy tym aby miała ona
wbudowaną obsługę MathML. Przy pisaniu programu używałem Firefoxa
i jego polecam. Po podaniu tekstu na wejście wstępny analizator dokonuje
jego kosmetycznej obróbki. Usuwa polskie ogonki i duże litery. Efekt pracy
jest zapisywany do pliku tekstowego.
5.2.1
Moduł słownika
Utworzony plik pobierany jest przez moduł słownika Słownik ma za zadanie podać pełną informację na temat formy gramatycznej zadanego wyrazu.
Informacje te zostaną wykorzystane w dalszej analizie tekstu. Dla działania tego modułu kluczowy jest plik ze słownictwem. Zawiera on dane na
temat możliwych słów. W każdej lini podane jest jedno słowo, informacje o
przypadku, liczbie i rodzaju oraz o formie podstawowej.
jeden
jednego
jednemu
4 2 1 1 jeden jeden brak
4 2 1 2 jeden jedn ego
4 2 1 3 jeden jedn emu
Należy pamiętać że błędy w pliku słownika, zwłaszcza brak pewnych słów
spowoduje błędy w działaniu całej aplikacji.
Słownik sprawdza w bazie danych czy figuruje w niej zadane słowo. Jeśli
nie- uważa słowo za nazwę zmiennej. Jeśli jednak wyraz zostanie odnaleziony
słownik generuje kod xml-a,zawierający dane na temat formy wyrazu. W
szczególności ważna jest jego forma podstawowa wyrazu, gdyż jej znajomość
pozwala na ewentualną korektę.Powstaje pytanie co począć jeśli więcej niż
6
Schemat programu- patrz dodatek ”A”
23
jeden wyraz z bazy będzie pasował do danego wzorca? Wtedy przekazywane
są informacje o wszystkich pasującch.
5.2.2
Moduł lexera
Analizator leksykalny to program przekształcający dane łańcuchy znaków na jednostki zwane tokenami.Analizator leksykalny izoluje analizator
składniowy od reprezentacji znakowej symbolu. Dzięki analizatorowi gramatyka formalna może być zdefiniowana w sposób abstrakcyjny. Do napisania
analizatora użyłem programu lex. Plik lexowy to zbiór formuł typu wzorzecakcja. Wzorzec to dowolne wyrażenie regularne opisujące token. Akcja to
działania jakie ma być podjęte po napotkaniu łańcucha znaków pasującego
do wzorca.
Wejściem dla mojego analizatora nie jest zwykły plik tekstowy ale plik
xml. Zatem musi on odpowiednio interpretować wszystkie zawarte w pliku
znaczniki. Po napotkaniu danego znacznika lexer przechodzi w odpowiedni
stan i czeka na dalsze dane.
Praca lexera jest podzielona na cykle. W pojedyńczym cyklu wczytywane
są dane na temat jednego tokena. Dane te są ładowane do struktury o nazwie
WORD. Po zakończeniu cyklu funkcje yylex zwraca strukturę do parsera.
Z technicznego punktu widzenia początek i koniec cyklu jest wyznaczany
przez otwarcie i zamknięcie elementu ”token”.
Konstrukcja lexera pozwala na realizację sterowania składnią, w celu
uproszczenia gramatyki. W języku potocznym pojedyńcze słowo może przyjąć wiele form, choć z matematycznego punktu widzenia formy te będą
oznaczać to samo. Liczbnie jeden może odpowiadać bardzo wiele słów - ”jeden”,”jedna”,”pierwszej”. Lexer upraszcza sytację, zakładając że za każdym
razem mamy do czynienia z tym samym tokenem. Taki mechanizm jest z
kilku względów bardzo wygodny. Nie tylko upraszcza bardzo gramatykę ale
pozwala na obsługę wielu nietypowych sytuacji. W szczególności uodparnia
IKWA w pewnym stopniu na błędy gramatyczne.
Wyobraźmy sobie że chcemy by Konwerter rozpoznawał frazę ”dwa do
kwadratu”. Można oczywiście zmodyfikować gramatykę dodając token ’KWADRAT’. Ale jest to nieeleganckie i wymaga ingerencji w kod żródłowy. O wiele łatwiej dodać wpis do pliku słownika.Przekształcanie leksemów do pewnych typowych postaci powoduje utratę istotych informacji. Przypinane są
one do tokenów w postaci etykiet.
24
Rysunek 2: etykieta
5.2.3
Moduł parsera
Wszystkie zaimplementowane algorytmy rozpoznawania wyrażeń matematycznych są wywoływane w module parsera. Dlatego jest on najciekawszą częścią aplikacji. Parser pobiera z pliku xml-owego kolejne tokeny i
informacje o nich. Dokonuje analizy na podstawie zdefiniowanej gramatyki
formalnej i tworzy drzewo wyrażenia.
iloczyn S
SSS
kk
k
SSS
k
SSS
kkk
k
k
SSS
k
k
S)
ukkk
wyrazenie
wyrazenie
token : razy
cala liczba
cala liczba
liczba jednocyf rowa
liczba jednocyf rowa
grupa 1B
grupa 1B
token : ”dwa”
token : ”trzy”
Drzewo wyrazenia konstruowane jest następująco: -dla każdego operatora i jego argumentów powstają osobne węzły. Węzły argumentów są dziećmi
25
węzła operatora. Operatorami mogą być działania arytmetyczne jak i pewne
elementy składniowe grupujące tokeny(?). Każdy węzeł posiada maksymalnie trzy wskaźniki na węzły-dzieci. Dodatkowo w węzłach-liściach podpięte
są struktury ’WORD’, zawierające dane o tokenach.
Drzewo wyrażeń konstruowane jest metodą wstępującą. Najpierw tworzone są węzły liście. W momencie redukcji podpinane są pod węzły rodziców.
wyrazenie RAZY wyrazenie
{$$= make_node(...,$1,NULL,$3,"iloczyn",...,$2);}
Po fazie tworzenia drzewa konieczna jest dodatkowa reorganizacja jego
struktury. Moduł leksera gubi pewne informacje dla uproszenia gramatyki. Prowadzi to do kilku nieprawidłowości, które muszą być skorygowane.
Po utworzeniu drzewa wyrażenia odpowiednie algorytmy przeszukują je w
poszukiwani nieprawidłowośći
5.3
5.3.1
Zaimplementowane algorytmy
Znajdowanie ułamków niewłaściwych
Sterowanie składnią umożliwia uproszczenie gramatyki. Ale powoduje
też utratę istotnych informacji i w efekcie błędną interpretację. Szczególnym przypadkiem są ułamki niewłaściwe. Jeśli nie uwzględnimy informacji
o formie gramatycznej poszczególnych tokenów nie będziemy w stanie odróżnić ułamka niewłaściwego od zwykłej liczby.
Po utworzeniu drzewa wyrażenia zostaje uruchomiony odpowiedni algorytm. Przechodzi on przez wszystkie liście drzewa, szukając tych które zawierają liczby. Jeśli natrafi na liczbę to sprawdza formę gramatyczną tokenów
odpowiadających kolejnym cyfrom. Pozwala mu to na ewentualne wykrycie
że liczba jest w rzeczywistości ułamkiem niewłaściwym. Wtedy dokonywana jest reorganizacja struktury drzewa- w miejsce liczby podpinany jest z
ułamek.
5.3.2
Sprawdzanie poprawnośći ułamka
Z punktu widzenia konwertera ułamek to dwie liczby, występujące obok
siebie. Każda z liczb musi być w odpowiedniej formie. Algorytm sprawdzający poprawność ułamka opiera się na kilku spostrzeżeniach. Po pierwsze
licznik ułamka jest zawsze liczebnikiem głównym. Przykładowo „dwie trzecie, „trzy czwarte, „pięć piątych. Wyjątkiem jest „ jedna druga, jedna trzecia itp. Po drugie mianownik jest zawsze przymiotnikiem w mianowniku(dla
l.poj.) lub w mianowniku albo dopełniaczu(dla l.mn.).
26
5.3.3
Drzewo wyrażenia a atrybuty syntezowane
Każdy węzeł, w zależności od jego typu, posiada pewne atrybuty. Jeżeli
węzeł-rodzic jest liczbą -musi posiadać atrybut ’wartośc’. Jest on syntezowany na podstawie atrybutów węzłów-dzieci (w tym przypadku kolejnych
cyfr)
5.4
Generowanie drzewa wyrażenia
W celach poglądowych parser generuje na podstawie drzewa wyrażenia
plik tekstowy dla programu DOT. Aplikacja ta na podstawie listy wierchołków grafu (więc także i dzrzewa) oraz listy krawędzi generuje drzewo w
formie graficznej.
5.5
Generowanie MathML
Ostatnia faza to generowanie wyjścia w języku MathML.IKWA zapisuje
wyrażenie matematyczne zarówno za pomocą znaczników warstwy treściowej
jak i znaczeniowej. Ponieważ dokument MathML ma budowę drzewiastą
nie jest to bardzo skomplikowane zadanie. Przechodząc przez węzły drzewa
wyrażenia, w zależności od nazwy węzła generowany jest fragment kodu.
27
Literatura
[1] ”The MathML Handbook” Pavi Sandhu
[2] ”Introduction to compiling techniques” J.P. Bennet
[3] ”Kompilatory: Reguły, metody i narzędzia” Alfred V.Aho
[4] skrypt ”Automaty i języki formalne” Tadeusz Krasiński
[5] ”Inteligentny Konwerter Wyrażeń Matematycznych”
http://kolos.math.uni.lodz.pl/ goszczu/konwerter/RUN
[6] XML Reference http://www.w3.org/XML/
[7] MathML Reference http://www.w3.org/Math/
[8] XSL Reference http://www.w3.org/Style/XSL/
[9] XSL Tranformations http://www.w3.org/TR/xslt20/
[10] Mozilla i MathML
http://www.mozilla.org/projects/mathml/
[11] Zamieszczanie dokumentów MathML w internecie
http://www.w3.org/Math/XSL/
[12] Konwersja z MathML do TEX
http://raleigh.ru/MathML/mmltex
[13] Konwersja z TEXdo MathML
http://hutchinson.belmont.ma.us/tth/mml/ttmmozform.html
[14] Lex i Yacc http://dinosaur.compilertools.net/
[15] Program DOT do generowania grafów
http://www.graphviz.org/Documentation/dotguide.pdf
Spis rysunków
1
2
3
XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
etykieta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
moduły Parsera . . . . . . . . . . . . . . . . . . . . . . . . . .
28
7
25
29
A
Schemat IKWA
Rysunek 3: moduły Parsera
3
29
B
Gramatyka Wyrażeń Arytmetycznych
Prezentuję wycinek GWA w celach poglądowych. 7 Zgodnie z konwecją
terminale pisane są dużymi a nieterminale małymi literami.
input:
line:
line;
wyrazenie;
wyrazenie:
cala_liczba
zmienna
cala_liczba i licznik mianownik
licznik mianownik
wyrazenie ROWNE wyrazenie
wyrazenie PROCENT
PIERWIASTEK Z wyrazenie
wyrazenie RAZY wyrazenie
wyrazenie PODZIELIC wyrazenie
wyrazenie DODAC wyrazenie
wyrazenie ODJAC wyrazenie
UMINUS wyrazenie
L_NAWIAS wyrazenie P_NAWIAS;
...
cala_liczba:
liczba_jednocyfrowa
liczba_dwucyfrowa
liczba_trzycyfrowa
liczba_tysieczna
liczba_milionowa;
|
|
|
|
...
liczba_jednocyfrowa:
grupa_1A |
grupa_1B |
grupa_1C;
grupa_1A:
JEDEN;
...
7
Całość gramatyki mieści się w pliku liczby.y.
30
|
|
|
|
|
|
|
|
|
|
|
|
C
Przykładowy dok. TEXdo konwersji na MathML
\section{Example document}
$$
1)\quad 1 - {3!\over(1!2!)^3}x^2+ {6!\over(2!4!)^3}x^4 \cdots \cdots \hfill
\hfill
= \biggl( \sum_{n=0}^\infty {x^n\over(n!)^3} \biggr)
\biggl(1-{x\over(1!)^3}+{x^2\over(2!)^3}-\cdots \biggr)
$$
$$
2)\hfill 1+ \sum\nolimits_{n=1}^\infty (-1)^n (1+4n)
\left\{ \prod_{j=1}^{n}
{2j-1\over 2j} \right\}^{\!3} = {2\over\pi} \hfill
$$
$$
3)\hfill 1+9\left( {1\over 4} \right)^4 + 17
\left( {1\cdot5\over4\cdot8}
\right)^4+25\left( {1\cdot5\cdot9\over4\cdot8\cdot12}
\right)^4 + \cdots =
{2^{3\over2} \over \pi^{1/2} \{\Gamma( {3\over 4})\}^2}
\hfill
$$
$$
4)\hfill 1 - 5\bigg( {1\over2} \bigg)^{\!5} + 9
\bigg( {1\cdot3\over2\cdot4}
\bigg)^{\!5} - 13\bigg( {1\cdot3\cdot5\over2\cdot4\cdot6}
\bigg)^{\!5} +
\cdots = {2 \over \{\Gamma({3\over 4})\}{\vphantom{\big(}}^4}
\hfill
$$
$$
5)\hfill \int^{\raise2pt\hbox{$\infty$}}_
{\lower2pt\hbox{$\scriptstyle0$}}
{dx \over (1 + x^2)(1+r^2x^2)(1+r^4x^2)\ldots} =
31
{\pi \over 2\sum_{j=0}^\infty (r^0\cdots r^j)}
$$
32
1)
X
∞
xn
(n!)3
n=0
3!
6!
1−
x2 +
x4 −· · · · · · =
3
(1!2!)
(2!4!)3
2)1 +
4
1
3)1 + 9
4
x
x2
1−
+
−· · ·
(1!)3 (2!)3
3

n

Y
2
2j
−
1
=
(−1)n (1 + 4n)
n=1


2j
π
j=1
X∞
1·5
+ 17
4·8
5
1
4)1 − 5
2
4
1·3
+9
2·4
1·5·9
+ 25
4 · 8 · 12
5
1·3·5
− 13
2·4·6
33
4
3
22
+ · · · = 1/2
π {Γ( 34 )}2
5
+ ··· =
2
{Γ( 43 )}
4