From 5f0e8a16ecbf06a6dad344ce2ef0974692ffc581 Mon Sep 17 00:00:00 2001 From: aarne Date: Thu, 16 Aug 2007 14:10:06 +0000 Subject: [PATCH] improving mini res morpho --- doc/tutorial/food1.png | Bin 0 -> 22805 bytes doc/tutorial/food2.png | Bin 0 -> 31506 bytes doc/tutorial/gf-tutorial2_9.txt | 389 +++++++++++++++++------------ doc/tutorial/resource/MorphoEng.gf | 65 +++-- doc/tutorial/resource/MorphoIta.gf | 33 ++- doc/tutorial/resource/SyntaxEng.gf | 19 +- doc/tutorial/resource/SyntaxIta.gf | 10 +- doc/tutorial/resource/TestEng.gf | 32 +-- 8 files changed, 335 insertions(+), 213 deletions(-) create mode 100644 doc/tutorial/food1.png create mode 100644 doc/tutorial/food2.png diff --git a/doc/tutorial/food1.png b/doc/tutorial/food1.png new file mode 100644 index 0000000000000000000000000000000000000000..767069dabfaee3fbea6193ab77c7c79a83b02f51 GIT binary patch literal 22805 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 Mr>mdKI;Vst0OMMmq5uE@ literal 0 HcmV?d00001 diff --git a/doc/tutorial/gf-tutorial2_9.txt b/doc/tutorial/gf-tutorial2_9.txt index 6c07b50c4..9363e16f3 100644 --- a/doc/tutorial/gf-tutorial2_9.txt +++ b/doc/tutorial/gf-tutorial2_9.txt @@ -304,7 +304,7 @@ other tasks are readily available for GF grammars: A typical GF application is based on a **multilingual grammar** involving translation on a special domain. Existing applications of this idea include -- [Alfa: http://www.cs.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html]: +- [Alfa http://www.cs.chalmers.se/~hallgren/Alfa/Tutorial/GFplugin.html]: a natural-language interface to a proof editor (languages: English, French, Swedish) - [KeY http://www.key-project.org/]: @@ -464,11 +464,11 @@ Windows users are recommended to install Cywgin, the free Unix shell for Windows %--! ==Running the GF program== -To start the GF program, assuming you have installed it, just type +To start the GF program, assuming you have installed it, just type +``gf`` in the Unix (or Cygwin) shell: ``` % gf ``` -in the shell. You will see GF's welcome message and the prompt ``>``. The command ``` @@ -895,9 +895,16 @@ The English concrete syntax gives no surprises: ``` Let us test how the grammar works in parsing: ``` - > p -lang=FoodEng "this delicious wine is very very Italian" + > import FoodEng.gf + > parse "this delicious wine is very very Italian" Is (This (QKind Delicious Wine)) (Very (Very Italian)) ``` +You can also try parsing in other categories than the ``startcat``, +by setting the command-line ``cat`` flag: +``` + p -cat=Kind "very Italian wine" + QKind (Very Italian) Wine +``` **Exercise**. Extend the ``Food`` grammar by ten new food kinds and qualities, and run the parser with new kinds of examples. @@ -997,7 +1004,7 @@ using the escape ``?``, as follows: A pipe of GF commands can have any length, but the "output type" (either string or tree) of one command must always match the "input type" -of the next command. +of the next command, in order for the result to make sense. The intermediate results in a pipe can be observed by putting the **tracing** flag ``-tr`` to each command whose output you @@ -1204,6 +1211,52 @@ The ``number`` flag gives the number of sentences generated. +===Multilingual syntax editing=== + +Any multilingual grammar can be used in the graphical syntax editor, which is +opened by the shell +command ``gfeditor`` followed by the names of the grammar files. +Thus +``` + % gfeditor FoodEng.gf FoodIta.gf +``` +opens the editor for the two ``Food`` grammars. + +The editor supports commands for manipulating an abstract syntax tree. +The process is started by choosing a category from the "New" menu. +Choosing ``Phrase`` creates a new tree of type ``Phrase``. A new tree +is in general completely unknown: it consists of a **metavariable** +``?1``. However, since the category ``Phrase`` in ``Food`` has +only one possible constructor, ``Is``, the tree is readily +given the form ``Is ?1 ?2``. Here is what the editor looks like at +this stage: + + [food1.png] + +Editing goes on by **refinements**, i.e. choices of constructors from +the menu, until no metavariables remain. Here is a tree resulting from the +current editing session: + + [food2.png] + +Editing can be continued even when the tree is finished. The user can shift +the **focus** to some of the subtrees by clicking at it of the corresponding +part of a linearization. In the picture, the focus is on "fish". +The menu shows no refinements, since there are no metavariables, but other +possible actions: +- to **change** "fish" to "cheese" or "wine" +- to **delete** "fish", i.e. change it to a metavariable +- to **wrap** "fish" in a qualification, i.e. change it to + ``QKind ? Fish``, where the quality can be given in a later refinement + + +In adition to menu-based editing, the tool supports refinement by parsing, +which gets accessible by middle-clicking at the linearization field. + +**Exercise**. Construct the sentence +//this very expensive cheese is very very delicious// +and its Italian translation by using ``gfeditor``. + ==The context-free grammar format== @@ -1235,14 +1288,15 @@ A function separates the shared parts of different computations from the changing parts, its **arguments**, or **parameters**. In functional programming languages, such as [Haskell http://www.haskell.org], it is possible to share much more -code with functions than in languages such as C and Java. +code with functions than in languages such as C and Java, because +of higher-order functions (functions that takes functions as arguments). ===Operation definitions=== GF is a functional programming language, not only in the sense that the abstract syntax is a system of functions (``fun``), but also because -functional programming can be used to define concrete syntax. This is +functional programming can be used when defining concrete syntax. This is done by using a new form of judgement, with the keyword ``oper`` (for **operation**), distinct from ``fun`` for the sake of clarity. Here is a simple example of an operation: @@ -1254,13 +1308,29 @@ The operation can be **applied** to an argument, and GF will ``` ss "boy" ===> {s = "boy"} ``` -(We use the symbol ``===>`` to indicate how an expression is -computed into a value; this symbol is not a part of GF) +We use the symbol ``===>`` to indicate how an expression is +computed into a value; this symbol is not a part of GF. Thus an ``oper`` judgement includes the name of the defined operation, its type, and an expression defining it. As for the syntax of the defining -expression, notice the **lambda abstraction** form ``\x -> t`` of -the function. +expression, notice the **lambda abstraction** form ``\``//x// ``->`` //t// of +the function. It reads: function with variable //x// and **function body** +//t//. + +For lambda abstraction with multiple arguments, we have the shorthand +``` + \x,y,z -> t === \x -> \y -> \z -> t +``` +The notation we have used for linearization rules, +``` + lin f x y = t +``` +is shorthand for +``` + lin f = \x,y -> t +``` + + @@ -1466,34 +1536,6 @@ same time: -===Visualizing module structure=== - -When you have created all the abstract syntaxes and -one set of concrete syntaxes needed for ``Foodmarket``, -your grammar consists of eight GF modules. To see how their -dependences look like, you can use the command -``visualize_graph = vg``, -``` - > visualize_graph -``` -and the graph will pop up in a separate window. - -The graph uses - -- oval boxes for abstract modules -- square boxes for concrete modules -- black-headed arrows for inheritance -- white-headed arrows for the concrete-of-abstract relation - - -[Foodmarket.png] - - -Just as the ``visualize_tree = vt`` command, the open source tools -Ghostview and Graphviz are needed. - - - ===System commands=== To document your grammar, you may want to print the @@ -1537,9 +1579,9 @@ details. In the following sections, we will go through some such linguistic details. The programming constructs needed when -doing this are useful for all GF programmers, even if they don't -hand-code the linguistics of their applications but get them -from libraries. It is also useful to know something about the +doing this are useful for all GF programmers, even for those who don't +hand-code the linguistics of their applications but get them +from libraries. And it is quite interesting to know something about the linguistic concepts of inflection, agreement, and parts of speech. @@ -1551,6 +1593,8 @@ Resource modules. Oper judgements. +Lambda abstraction. + The ``.cf`` grammar format. @@ -1592,7 +1636,7 @@ adjectives, and verbs can have in some languages that you know. %--! ==Parameters and tables== -We define the **parameter type** of number in Englisn by +We define the **parameter type** of number in English by using a new form of judgement: ``` param Number = Sg | Pl ; @@ -1632,7 +1676,7 @@ selection argument. Thus ===> "cheeses" ``` -**Exercise**. In a previous exercise, we make a list of the possible +**Exercise**. In a previous exercise, we made a list of the possible forms that nouns, adjectives, and verbs can have in some languages that you know. Now take some of the results and implement them by using parameter type definitions and tables. Write them into a ``resource`` @@ -1667,7 +1711,7 @@ The **gluing** operator ``+`` tells that the string held in the variable ``x`` and the ending ``"s"`` are written together to form one **token**. Thus, for instance, ``` - (regNoun "cheese").s ! Pl ---> "cheese" + "s" ---> "cheeses" + (regNoun "cheese").s ! Pl ===> "cheese" + "s" ===> "cheeses" ``` **Exercise**. Identify cases in which the ``regNoun`` paradigm does not @@ -1683,7 +1727,7 @@ considered in earlier exercises. ==Using parameters in concrete syntax== We can now enrich the concrete syntax definitions to -comprise morphology. This will involve a more radical +comprise morphology. This will permit a more radical variation between languages (e.g. English and Italian) then just the use of different words. In general, parameters and linearization types are different in @@ -1697,7 +1741,7 @@ use of a common abstract syntax. The rule of subject-verb agreement in English says that the verb phrase must be inflected in the number of the subject. This means that a noun phrase (functioning as a subject), inherently -//has// a number, which it passes to the verb. The verb does not +has a number, which it passes to the verb. The verb does not //have// a number, but must be able to //receive// whatever number the subject has. This distinction is nicely represented by the different linearization types of **noun phrases** and **verb phrases**: @@ -1742,7 +1786,8 @@ concrete FoodsEng of Foods = open Prelude, MorphoEng in { Item = {s : Str ; n : Number} ; lin - Is item quality = ss (item.s ++ (mkVerb "are" "is").s ! item.n ++ quality.s) ; + Is item quality = + ss (item.s ++ (mkVerb "are" "is").s ! item.n ++ quality.s) ; This = det Sg "this" ; That = det Sg "that" ; These = det Pl "these" ; @@ -1760,10 +1805,11 @@ concrete FoodsEng of Foods = open Prelude, MorphoEng in { Boring = ss "boring" ; oper - det : Number -> Str -> Noun -> {s : Str ; n : Number} = \n,d,cn -> { - s = d ++ cn.s ! n ; - n = n - } ; + det : Number -> Str -> Noun -> {s : Str ; n : Number} = + \n,d,cn -> { + s = d ++ cn.s ! n ; + n = n + } ; } ``` @@ -1891,6 +1937,9 @@ are not a good idea in top-level categories accessed by the users of a grammar application. +**Exercise**. Define the language ``a^n b^n c^n`` in GF. + + ==More constructs for concrete syntax== In this section, we go through constructs that are not necessary @@ -1934,7 +1983,8 @@ The symbol ``**`` is used for both constructs. lin Follow = regVerb "folgen" ** {c = Dative} ; ``` To extend a record type or a record with a field whose label it -already has is a type error. +already has is a type error. It is also an error to extend a type or +object that is not a record. A record type //T// is a **subtype** of another one //R//, if //T// has all the fields of //R// and possibly other fields. For instance, @@ -1988,6 +2038,60 @@ possible to write, slightly surprisingly, } ``` +===Regular expression patterns=== + +To define string operations computed at compile time, such +as in morphology, it is handy to use regular expression patterns: + - //p// ``+`` //q// : token consisting of //p// followed by //q// + - //p// ``*`` : token //p// repeated 0 or more times + (max the length of the string to be matched) + - ``-`` //p// : matches anything that //p// does not match + - //x// ``@`` //p// : bind to //x// what //p// matches + - //p// ``|`` //q// : matches what either //p// or //q// matches + + +The last three apply to all types of patterns, the first two only to token strings. +As an example, we give a rule for the formation of English word forms +ending with an //s// and used in the formation of both plural nouns and +third-person present-tense verbs. +``` + add_s : Str -> Str = \w -> case w of { + _ + "oo" => w + "s" ; -- bamboo + _ + ("s" | "z" | "x" | "sh" | "o") => w + "es" ; -- bus, hero + _ + ("a" | "o" | "u" | "e") + "y" => w + "s" ; -- boy + x + "y" => x + "ies" ; -- fly + _ => w + "s" -- car + } ; +``` +Here is another example, the plural formation in Swedish 2nd declension. +The second branch uses a variable binding with ``@`` to cover the cases where an +unstressed pre-final vowel //e// disappears in the plural +(//nyckel-nycklar, seger-segrar, bil-bilar//): +``` + plural2 : Str -> Str = \w -> case w of { + pojk + "e" => pojk + "ar" ; + nyck + "e" + l@("l" | "r" | "n") => nyck + l + "ar" ; + bil => bil + "ar" + } ; +``` +Variables in regular expression patterns +are always bound to the **first match**, which is the first +in the sequence of binding lists. For example: +- ``x + "e" + y`` matches ``"peter"`` with ``x = "p", y = "ter"`` +- ``x + "er"*`` matches ``"burgerer"`` with ``x = "burg" + + + +**Exercise**. Implement the German **Umlaut** operation on word stems. +The operation changes the vowel of the stressed stem syllable as follows: +//a// to //ä//, //au// to //äu//, //o// to //ö//, and //u// to //ü//. You +can assume that the operation only takes syllables as arguments. Test the +operation to see whether it correctly changes //Arzt// to //Ärzt//, +//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//. + +**Exercise**. Define an operation that deletes all vowels from the +end of a string, so that e.g. "aigeia" becomes "aig". + ===Free variation=== @@ -2064,39 +2168,55 @@ FIXME: The linearization type is ``{s : Str}`` for all these categories. ===Overloading of operations=== Large libraries, such as the GF Resource Grammar Library, may define -hundreds of names, which can be unpractical -for both the library writer and the user. The writer has to invent longer +hundreds of names. This can be unpractical +for both the library author and the user: the author has to invent longer and longer names which are not always intuitive, -and the user has to learn or at least be able to find all these names. -A solution to this problem, adopted by languages such as C++, is **overloading**: -the same name can be used for several functions. When such a name is used, the -compiler performs **overload resolution** to find out which of the possible functions -is meant. The resolution is based on the types of the functions: all functions that +and the author has to learn or at least be able to find all these names. +A solution to this problem, adopted by languages such as C++, +is **overloading**: one and the same name can be used for several functions. +When such a name is used, the +compiler performs **overload resolution** to find out which of +the possible functions is meant. Overload resolution is based on +the types of the functions: all functions that have the same name must have different types. In C++, functions with the same name can be scattered everywhere in the program. In GF, they must be grouped together in ``overload`` groups. Here is an example -of an overload group, defining four ways to define nouns in Italian: +of an overload group, giving three different ways to define verbs in English: ``` - oper mkN = overload { - mkN : Str -> N = -- regular nouns - mkN : Str -> Gender -> N = -- regular nouns with unexpected gender - mkN : Str -> Str -> N = -- irregular nouns - mkN : Str -> Str -> Gender -> N = -- irregular nouns with unexpected gender + oper mkV = overload { + mkV : (walk : Str) -> V = -- regular verbs + mkV : (omit,omitted : Str) -> V = -- regular verbs with duplication + mkN : (sing,sang,sung : Str) -> V = -- irregular verbs + mkN : (run,ran,run,running : Str) -> V = -- irregular verbs with duplication } ``` -All of the following uses of ``mkN`` are easy to resolve: -``` - lin Pizza = mkN "pizza" ; -- Str -> N - lin Hand = mkN "mano" Fem ; -- Str -> Gender -> N - lin Man = mkN "uomo" "uomini" ; -- Str -> Str -> N -``` +Intuitively, the forms correspond to the way regular and irregular words +are given in a dictionary: by listing relevant forms, instead of +referring to a paradigm. =Implementing morphology and syntax= +In this chapter, we will dig deeper into linguistic concepts than +so far. We will build an implementation of a linguistic motivated +fragment of English and Italian, covering basic morphology of syntax. +The result is a miniature of the GF resource library, which will +be covered in the next chapter. There are two main purposes +for this chapter: +- first, to understand the linguistic concepts underlying the resource + grammar library +- second, to get practice in the more advanced constructs of concrete syntax + + +However, the reader who is not willing to work on an advanced level +of concrete syntax may just skim through the introductory parts of +each section, thus using the chapter in its first purpose only. + + + ==Worst-case functions and data abstraction== Some English nouns, such as ``mouse``, are so irregular that @@ -2133,7 +2253,7 @@ terms, ``Noun`` is then treated as an **abstract datatype**. %--! -==A system of paradigms using Prelude operations== +==A system of paradigms using predefined string operations== In addition to the completely regular noun paradigm ``regNoun``, some other frequent noun paradigms deserve to be @@ -2156,11 +2276,13 @@ all characters but the last) of a string: ``` The operation ``init`` belongs to a set of operations in the resource module ``Prelude``, which therefore has to be -``open``ed so that ``init`` can be used. Its dual is ``last``: +``open``ed so that ``init`` can be used. ``` > cc init "curry" "curr" - +``` +Its dual is ``last``: +``` > cc last "curry" "y" ``` @@ -2192,7 +2314,7 @@ inflection paradigm. A way to help this is to define a more intelligent paradigm, which chooses the ending by first analysing the lemma. The following variant for English regular nouns puts together all the previously shown paradigms, and chooses one of them on the basis of -the final letter of the lemma (found by the prelude operator ``last``). +the final letter of the lemma (found by the prelude operation ``last``). ``` regNoun : Str -> Noun = \s -> case last s of { "s" | "z" => mkNoun s (s + "es") ; @@ -2200,9 +2322,6 @@ the final letter of the lemma (found by the prelude operator ``last``). _ => mkNoun s (s + "s") } ; ``` -This definition displays many GF expression forms not shown befores; -these forms are explained in the next section. - The paradigms ``regNoun`` does not give the correct forms for all nouns. For instance, //mouse - mice// and //fish - fish// must be given by using ``mkNoun``. @@ -2226,58 +2345,6 @@ is factored out as a separate ``oper``, which is shared with -%--! -==Regular expression patterns== - -To define string operations computed at compile time, such -as in morphology, it is handy to use regular expression patterns: - - //p// ``+`` //q// : token consisting of //p// followed by //q// - - //p// ``*`` : token //p// repeated 0 or more times - (max the length of the string to be matched) - - ``-`` //p// : matches anything that //p// does not match - - //x// ``@`` //p// : bind to //x// what //p// matches - - //p// ``|`` //q// : matches what either //p// or //q// matches - - -The last three apply to all types of patterns, the first two only to token strings. -As an example, we give a rule for the formation of English word forms -ending with an //s// and used in the formation of both plural nouns and -third-person present-tense verbs. -``` - add_s : Str -> Str = \w -> case w of { - _ + "oo" => w + "s" ; -- bamboo - _ + ("s" | "z" | "x" | "sh" | "o") => w + "es" ; -- bus, hero - _ + ("a" | "o" | "u" | "e") + "y" => w + "s" ; -- boy - x + "y" => x + "ies" ; -- fly - _ => w + "s" -- car - } ; -``` -Here is another example, the plural formation in Swedish 2nd declension. -The second branch uses a variable binding with ``@`` to cover the cases where an -unstressed pre-final vowel //e// disappears in the plural -(//nyckel-nycklar, seger-segrar, bil-bilar//): -``` - plural2 : Str -> Str = \w -> case w of { - pojk + "e" => pojk + "ar" ; - nyck + "e" + l@("l" | "r" | "n") => nyck + l + "ar" ; - bil => bil + "ar" - } ; -``` -Variables in regular expression patterns -are always bound to the **first match**, which is the first -in the sequence of binding lists. For example: -- ``x + "e" + y`` matches ``"peter"`` with ``x = "p", y = "ter"`` -- ``x + "er"*`` matches ``"burgerer"`` with ``x = "burg" - - - -**Exercise**. Implement the German **Umlaut** operation on word stems. -The operation changes the vowel of the stressed stem syllable as follows: -//a// to //ä//, //au// to //äu//, //o// to //ö//, and //u// to //ü//. You -can assume that the operation only takes syllables as arguments. Test the -operation to see whether it correctly changes //Arzt// to //Ärzt//, -//Baum// to //Bäum//, //Topf// to //Töpf//, and //Kuh// to //Küh//. - %--! @@ -2370,6 +2437,7 @@ The ``number`` flag gives the number of exercises generated. + =Using the resource grammar library= In this chapter, we will take a look at the GF resource grammar library. @@ -2478,27 +2546,27 @@ We will also need the following structural words from ``Syntax``. For French, we will use the following part of ``ParadigmsFre``. -|| Function | Type | Example || -| ``Gender`` | ``Type`` | - | -| ``masculine`` | ``Gender`` | - | -| ``feminine`` | ``Gender`` | - | -| ``mkN`` | ``(cheval : Str) -> N`` | - | -| ``mkN`` | ``(foie : Str) -> Gender -> N`` | - | -| ``mkA`` | ``(cher : Str) -> A`` | - | -| ``mkA`` | ``(sec,seche : Str) -> A`` | - | +|| Function | Type || +| ``Gender`` | ``Type`` | +| ``masculine`` | ``Gender`` | +| ``feminine`` | ``Gender`` | +| ``mkN`` | ``(cheval : Str) -> N`` | +| ``mkN`` | ``(foie : Str) -> Gender -> N`` | +| ``mkA`` | ``(cher : Str) -> A`` | +| ``mkA`` | ``(sec,seche : Str) -> A`` | For German, we will use the following part of ``ParadigmsGer``. -|| Function | Type | Example || -| ``Gender`` | ``Type`` | - | -| ``masculine`` | ``Gender`` | - | -| ``feminine`` | ``Gender`` | - | -| ``neuter`` | ``Gender`` | - | -| ``mkN`` | ``(Stufe : Str) -> N`` | - | -| ``mkN`` | ``(Bild,Bilder : Str) -> Gender -> N`` | - | -| ``mkA`` | ``Str -> A`` | - | -| ``mkA`` | ``(gut,besser,beste : Str) -> A`` | //gut,besser,beste// | +|| Function | Type || +| ``Gender`` | ``Type`` | +| ``masculine`` | ``Gender`` | +| ``feminine`` | ``Gender`` | +| ``neuter`` | ``Gender`` | +| ``mkN`` | ``(Stufe : Str) -> N`` | +| ``mkN`` | ``(Bild,Bilder : Str) -> Gender -> N`` | +| ``mkA`` | ``(klein : Str) -> A`` | +| ``mkA`` | ``(gut,besser,beste : Str) -> A`` | **Exercise**. Try out the morphological paradigms in different languages. Do @@ -2574,15 +2642,15 @@ the genders of some nouns, which cannot be correctly inferred from the word. In French, for example, the one-argument ``mkN`` assigns the noun the feminine gender if and only if it ends with an //e//. Therefore the words //fromage// and -//pizza// are given genders. One can of course always give genders manually, to -be on the safe side. +//pizza// are given genders manually. +One can of course always give genders manually, to be on the safe side. As for inflection, the one-argument adjective pattern ``mkA`` takes care of completely regular adjective such as //chaud-chaude//, but also of special cases such as //italien-italienne//, //cher-chère//, and //délicieux-délicieuse//. But it cannot form //frais-fraîche// properly. Once again, you can give more forms to be on the safe side. You can also test the paradigms in the GF -program. +system. **Exercise**. Compile the grammar ``FoodFre`` and generate and parse some sentences. @@ -2641,7 +2709,8 @@ It takes as arguments two interfaces: Functors opening ``Syntax`` and a domain lexicon interface are in fact -so typical in GF applications, that this structure could be called a **design patter** +so typical in GF applications, that this structure could be called +a **design patter** for GF grammars. The idea in this pattern is, again, that the languages use the same syntactic structures but different words. @@ -2655,8 +2724,10 @@ appropriate types). For example, ``` instance LexFoodGer of LexFood = open SyntaxGer, ParadigmsGer in ``` -Notice that when an interface opens an interface, such as ``Syntax``, then its instance -opens an instance of it. But the instance may also open some resources - typically, +Notice that when an interface opens an interface, such as ``Syntax``, +then its instance +opens an instance of it. But the instance may also open some other +resources - typically, a domain lexicon instance opens a ``Paradigms`` module. In the function-functor analogy, we now have @@ -3782,7 +3853,7 @@ of GF to facilitate this. #PARTtwo -=Embedded grammars in Haskell and Java= +=Embedded grammars in Haskell= GF grammars can be used as parts of programs written in the following languages. We will go through a skeleton application in @@ -4083,6 +4154,8 @@ from source by typing ``make``. Here is a minimal such ``Makefile``: ``` +==The Embedded GF Haskell API== + =Embedded grammars in Java= @@ -4193,11 +4266,11 @@ describes the use of the editor, which works for any multilingual GF grammar. Here is a snapshot of the editor: -#BCEN +%#BCEN -#EDITORPNG +%#EDITORPNG -#ECEN +%#ECEN The grammars of the snapshot are from the diff --git a/doc/tutorial/resource/MorphoEng.gf b/doc/tutorial/resource/MorphoEng.gf index 829688c01..b2255d0d4 100644 --- a/doc/tutorial/resource/MorphoEng.gf +++ b/doc/tutorial/resource/MorphoEng.gf @@ -2,14 +2,61 @@ resource MorphoEng = open Prelude in { + -- the lexicon construction API + + oper + mkN : overload { + mkN : (bus : Str) -> Noun ; + mkN : (man,men : Str) -> Noun ; + } ; + + mkA : (warm : Str) -> Adjective ; + + mkV : overload { + mkV : (kiss : Str) -> Verb ; + mkV : (do,does : Str) -> Verb ; + } ; + + mkV2 : overload { + mkV2 : (love : Verb) -> Verb2 ; + mkV2 : (talk : Verb) -> (about : Str) -> Verb2 ; + } ; + + -- grammar-internal definitions + param Number = Sg | Pl ; oper Noun, Verb : Type = {s : Number => Str} ; + Adjective : Type = {s : Str} ; + Verb2 : Type = Verb ** {c : Str} ; - NP = {s : Str ; n : Number} ; - VP = {s : Bool => Bool => Number => Str * Str} ; -- decl, pol + mkN = overload { + mkN : (bus : Str) -> Noun = \s -> mkNoun s (add_s s) ; + mkN : (man,men : Str) -> Noun = mkNoun ; + } ; + + mkA : (warm : Str) -> Adjective = ss ; + + mkV = overload { + mkV : (kiss : Str) -> Verb = \s -> mkVerb s (add_s s) ; + mkV : (do,does : Str) -> Verb = mkVerb ; + } ; + + mkV2 = overload { + mkV2 : (love : Verb) -> Verb2 = \love -> love ** {c = []} ; + mkV2 : (talk : Verb) -> (about : Str) -> Verb2 = + \talk,about -> talk ** {c = about} ; + } ; + + add_s : Str -> Str = \w -> case w of { + _ + "oo" => w + "s" ; -- bamboo + _ + ("s" | "z" | "x" | "sh" | "o") => w + "es" ; -- bus, hero + _ + ("a" | "o" | "u" | "e") + "y" => w + "s" ; -- boy + x + "y" => x + "ies" ; -- fly + _ => w + "s" -- car + } ; mkNoun : Str -> Str -> Noun = \x,y -> { s = table { @@ -18,19 +65,5 @@ resource MorphoEng = open Prelude in { } } ; - regNoun : Str -> Noun = \s -> case last s of { - "s" | "z" => mkNoun s (s + "es") ; - "y" => mkNoun s (init s + "ies") ; - _ => mkNoun s (s + "s") - } ; - mkVerb : Str -> Str -> Verb = \x,y -> mkNoun y x ; - - regVerb : Str -> Verb = \s -> case last s of { - "s" | "z" => mkVerb s (s + "es") ; - "y" => mkVerb s (init s + "ies") ; - "o" => mkVerb s (s + "es") ; - _ => mkVerb s (s + "s") - } ; - } diff --git a/doc/tutorial/resource/MorphoIta.gf b/doc/tutorial/resource/MorphoIta.gf index 2d5272812..7bf4de1a1 100644 --- a/doc/tutorial/resource/MorphoIta.gf +++ b/doc/tutorial/resource/MorphoIta.gf @@ -4,6 +4,13 @@ resource MorphoIta = open Prelude in { + -- the lexicographer's API + + oper + masculine, feminine : Gender ; + + + param Number = Sg | Pl ; Gender = Masc | Fem ; @@ -16,6 +23,10 @@ Verb : Type = {s : Number => Str} ; + -- two-place verbs have a preposition + + Verb2 : Type = Verb ** {c : Str} ; + -- this function takes the gender and both singular and plural forms mkNoun : Gender -> Str -> Str -> Noun = \g,vino,vini -> { @@ -28,16 +39,18 @@ -- this function takes the singular form - regNoun : Str -> Noun = \vino -> - let - vin = init vino ; - o = last vino - in - case o of { - "a" => mkNoun Fem vino (vin + "e") ; -- pizza - "o" | "e" => mkNoun Masc vino (vin + "i") ; -- vino, pane - _ => mkNoun Masc vino vino -- tram - } ; + regNoun : Str -> Noun = \vino -> + case vino of { + vin + c@("c" | "g") + "a" + => mkNoun Fem vino (vin + c + "he") ; -- banche + vin + "a" + => mkNoun Fem vino (vin + "e") ; -- pizza + vin + c@("c" | "g") + "o" + => mkNoun Masc vino (vin + c + "hi") ; -- boschi + vin + ("o" | "e") + => mkNoun Masc vino (vin + "i") ; -- vino, pane + _ => mkNoun Masc vino vino -- tram + } ; -- to make nouns such as "carne", "università" feminine diff --git a/doc/tutorial/resource/SyntaxEng.gf b/doc/tutorial/resource/SyntaxEng.gf index 4eac0058e..f1de47e21 100644 --- a/doc/tutorial/resource/SyntaxEng.gf +++ b/doc/tutorial/resource/SyntaxEng.gf @@ -6,17 +6,17 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { Phr = {s : Str} ; S = {s : Str} ; QS = {s : Str} ; - NP = MorphoEng.NP ; - IP = MorphoEng.NP ; + NP = NounPhrase ; + IP = NounPhrase ; CN = Noun ; Det = {s : Str ; n : Number} ; AP = {s : Str} ; AdA = {s : Str} ; - VP = MorphoEng.VP ; + VP = VerbPhrase ; N = Noun ; A = {s : Str} ; V = Verb ; - V2 = Verb ** {c : Str} ; + V2 = Verb2 ; lin PhrS = postfixSS "." ; @@ -31,13 +31,13 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { IPPosV2 ip np v2 = { s = let - vp : MorphoEng.VP = {s = \\q,b,n => predVerb v2 q b n} ; + vp : VerbPhrase = {s = \\q,b,n => predVerb v2 q b n} ; in bothWays (ip.s ++ (predVP False True np vp).s) v2.c } ; IPNegV2 ip np v2 = { s = let - vp : MorphoEng.VP = {s = \\q,b,n => predVerb v2 q b n} ; + vp : VerbPhrase = {s = \\q,b,n => predVerb v2 q b n} ; in bothWays (ip.s ++ (predVP False False np vp).s) v2.c } ; @@ -77,7 +77,10 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { very_AdA = {s = "very"} ; oper - predVP : Bool -> Bool -> MorphoEng.NP -> MorphoEng.VP -> SS = + NounPhrase = {s : Str ; n : Number} ; + VerbPhrase = {s : Bool => Bool => Number => Str * Str} ; -- decl, pol + + predVP : Bool -> Bool -> NounPhrase -> VerbPhrase -> SS = \q,b,np,vp -> { s = let vps = vp.s ! q ! b ! np.n in case q of { @@ -92,7 +95,7 @@ concrete SyntaxEng of Syntax = open Prelude, MorphoEng in { } ; do : Bool -> Number -> Str = \b,n -> - posneg b ((regVerb "do").s ! n) ; + posneg b ((mkV "do").s ! n) ; predVerb : Verb -> Bool -> Bool -> Number -> Str * Str = \verb,q,b,n -> let diff --git a/doc/tutorial/resource/SyntaxIta.gf b/doc/tutorial/resource/SyntaxIta.gf index a0c2405e7..4721a5d4e 100644 --- a/doc/tutorial/resource/SyntaxIta.gf +++ b/doc/tutorial/resource/SyntaxIta.gf @@ -8,16 +8,16 @@ concrete SyntaxIta of Syntax = open Prelude, MorphoIta in { QS = {s : Str} ; NP = {s : Str ; g : Gender ; n : Number} ; IP = {s : Str ; g : Gender ; n : Number} ; - CN = {s : Number => Str ; g : Gender} ; + CN = Noun ; Det = {s : Gender => Str ; n : Number} ; AP = {s : Gender => Number => Str} ; AdA = {s : Str} ; VP = {s : Bool => Gender => Number => Str} ; - N = {s : Number => Str ; g : Gender} ; - A = {s : Gender => Number => Str} ; - V = {s : Number => Str} ; - V2 = {s : Number => Str ; c : Str} ; + N = Noun ; + A = Adjective ; + V = Verb ; + V2 = Verb2 ; lin PhrS = postfixSS "." ; diff --git a/doc/tutorial/resource/TestEng.gf b/doc/tutorial/resource/TestEng.gf index 3bfe52dfd..4099753f1 100644 --- a/doc/tutorial/resource/TestEng.gf +++ b/doc/tutorial/resource/TestEng.gf @@ -3,21 +3,21 @@ concrete TestEng of Test = SyntaxEng ** open Prelude, MorphoEng in { lin - Wine = regNoun "wine" ; - Cheese = regNoun "cheese" ; - Fish = mkNoun "fish" "fish" ; - Pizza = regNoun "pizza" ; - Waiter = regNoun "waiter" ; - Customer = regNoun "customer" ; - Fresh = ss "fresh" ; - Warm = ss "warm" ; - Italian = ss "Italian" ; - Expensive = ss "expensive" ; - Delicious = ss "delicious" ; - Boring = ss "boring" ; - Stink = regVerb "stink" ; - Eat = regVerb "eat" ** {c = []} ; - Love = regVerb "love" ** {c = []} ; - Talk = regVerb "talk" ** {c = "about"} ; + Wine = mkN "wine" ; + Cheese = mkN "cheese" ; + Fish = mkN "fish" "fish" ; + Pizza = mkN "pizza" ; + Waiter = mkN "waiter" ; + Customer = mkN "customer" ; + Fresh = mkA "fresh" ; + Warm = mkA "warm" ; + Italian = mkA "Italian" ; + Expensive = mkA "expensive" ; + Delicious = mkA "delicious" ; + Boring = mkA "boring" ; + Stink = mkV "stink" ; + Eat = mkV2 (mkV "eat") ; + Love = mkV2 (mkV "love") ; + Talk = mkV2 (mkV "talk") "about" ; }