forked from GitHub/gf-rgl
Merge branch 'GrammaticalFramework:master' into master
This commit is contained in:
BIN
src/FileHierarchy.png
Normal file
BIN
src/FileHierarchy.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
78
src/README.md
Normal file
78
src/README.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# Introduction
|
||||
|
||||
## Intended audience of this Readme
|
||||
|
||||
This Readme is designed for new developers who wish to either extend/improve on a resource grammar or create a new one. It provides an overview of the relationships between files and a simple working pipeline for developers to get started.
|
||||
|
||||
Note that while files in this folder are meant to be named with 3 letter suffixes representing the language, e.g. "ResBul" for the Bulgarian resource file, this Readme will use a 4 letter suffix "Lang" to represent a language in general, e.g. "ResLang".
|
||||
|
||||
## Author(s) of this Readme
|
||||
|
||||
This Readme was written by Nemo and edited by Inari on 14th August 2022.
|
||||
|
||||
# Creating a new resource grammar
|
||||
|
||||
If you are working on an RGL for a new language, you will need to run "Clone.hs" in the "src" folder so that you can clone a project from another language to your language to give you a basis to start with.
|
||||
|
||||
As per the instructions, the syntax is "Clone fromdir todir fromlang tolang", e.g. "runghc Clone swedish danish Swe Dan". You may want to add the option --comment-body after the word "Clone" to comment out every line in the body of the files to start fresh.
|
||||
|
||||
This is especially useful if your new language has very little in common with the language you are copying from because they come from different language families.
|
||||
|
||||
# File hierarchy
|
||||
|
||||
The number of files may be overwhelming, but they are related together following the graphic under "Module dependencies" under the rgl-tutorial. In the graphic, an example is that GrammarIta and ResIta are dependent on Prelude as they have arrows pointing towards the Prelude ellipse.
|
||||
|
||||
http://www.grammaticalframework.org/lib/doc/rgl-tutorial/index.html
|
||||
|
||||
The below graphic is an alternative graphic explaining the relations, taken from private correspondence with Inari.
|
||||
|
||||

|
||||
|
||||
CatLang defines the categories, and the modules AdjectiveLang, NounLang, SentenceLang, PhraseLang, and so on, all extend Cat. The Grammar is defined as a collection of all those AdjectiveLang, NounLang, SentenceLang, and so on modules. LangLang is defined as the collection GrammarLang and LexiconLang and is where you will be checking your program. You may ignore:
|
||||
|
||||
- AllLangAbs, AllLang, ExtendLang, ExtraLangAbs, ExtraLang, ConstructionLang, DocumentationLang, MarkupLang, BackwardLang
|
||||
|
||||
If the language you cloned from has any of these resource modules, you can remove them completely:
|
||||
|
||||
- IrregLang (unless you want to populate it with irregular verbs of your own language), MissingLang (see how to generate your own if you need it later: https://inariksit.github.io/gf/2018/08/28/gf-gotchas.html#generating-missingxxx)
|
||||
|
||||
# Relationships between functions in files
|
||||
|
||||
There may be several ways the functions within the files are organised relative to one another. In other words, there may be several schemas depending on the author. More recent RGLs might implement one schema detailed by this blog post by Inari.
|
||||
https://inariksit.github.io/gf/2018/08/28/gf-gotchas.html#my-naming-scheme-for-lincats-and-opers
|
||||
|
||||
# Main goal
|
||||
|
||||
You may think of your long-term goal as eventually implementing all the abstract functions found in the "abstract" folder. In other words, you are somewhat constrained by the available categories in Cat.gf and functions in relevant e.g. Noun.gf, Verb.gf etc. files.
|
||||
|
||||
In the future, if you find that the available functions do not apply to your language, you may search in the Extend.gf file for more optional functions, or in Extra.gf. if it doesn't exist, create your own ExtraLangAbs.gf with the concrete ExtraLang.gf, all in the same directory gf-rgl/src/lang. This blog post contains more information.
|
||||
|
||||
https://inariksit.github.io/gf/2021/02/15/rgl-api-core-extensions.html#language-specific-extra-modules
|
||||
|
||||
There is a prioritised list of RGL functions for new resource grammars written by contributor heatherleaf. You can start by implementing the "+++" functions.
|
||||
|
||||
https://github.com/GrammaticalFramework/gf-rgl/issues/238
|
||||
|
||||
# Working pipeline example
|
||||
|
||||
For a pipeline, You might wish to start with implementing functions that create Noun Phrase like DetCN: Det -> CN -> NP; a function that takes a Determiner and a Common Noun and gives a Noun Phrase. In this case, the workflow is done by editing:
|
||||
|
||||
1. ResLang: Contains the relevant Operations (Opers) for e.g. "Noun", "mkN", "Determiner" and "Quant".
|
||||
2. ParamLang: Contains the language paramters used in ResLang.
|
||||
3. CatLang: CatLang will be defined in terms of Opers found in ResLang. This means that instead of Defining NP in CatLang as, say, {s: Str}, you will define NP as ResLang.NounPhrase, which points to a NounPhrase Oper in ResLang. Then you need to implement the word syntax in NounLang.
|
||||
4. NounLang: Contains the relevant lins in defining sentence structure.
|
||||
5. LexiconLang: Contains the lins that define the Noun words.
|
||||
|
||||
As you will have to define a determiner that is created from a Quant, you will have to look at the following files too.
|
||||
|
||||
6. StructuralLang: Contains the lins that define the Quant/Determiner words.
|
||||
|
||||
Note that you will have to use mkQuant instead of creating Det by mkDet directly.
|
||||
|
||||
# Testing your work
|
||||
|
||||
When you are done with your implementation, you may test that everything works by starting up LangLang and, in this case, writing something like:
|
||||
|
||||
```DetCN (DetQuant xxxx_Quant NumSg) (UseN xxxx_N)```
|
||||
|
||||
Where you replace 'xxxx' with the word in Lang.
|
||||
@@ -126,6 +126,8 @@ abstract Cat = Common ** {
|
||||
N ; -- common noun e.g. "house"
|
||||
N2 ; -- relational noun e.g. "son"
|
||||
N3 ; -- three-place relational noun e.g. "connection"
|
||||
GN ; -- given name e.g. "George"
|
||||
SN ; -- second name e.g. "Washington"
|
||||
PN ; -- proper name e.g. "Paris"
|
||||
|
||||
-- DEPRECATED: QuantSg, QuantPl
|
||||
|
||||
@@ -14,6 +14,8 @@ fun
|
||||
InflectionN2 : N2 -> Inflection ;
|
||||
InflectionN3 : N3 -> Inflection ;
|
||||
InflectionPN : PN -> Inflection ;
|
||||
InflectionGN : GN -> Inflection ;
|
||||
InflectionSN : SN -> Inflection ;
|
||||
InflectionA : A -> Inflection ;
|
||||
InflectionA2 : A2 -> Inflection ;
|
||||
InflectionV : V -> Inflection ;
|
||||
|
||||
@@ -292,4 +292,10 @@ cat X ; -- for words that are difficult to classify, mainly for MorphoDict
|
||||
fun
|
||||
CardCNCard : Card -> CN -> Card ; -- three million, four lakh, six dozen etc
|
||||
|
||||
GivenName : GN -> PN ;
|
||||
MaleSurname : SN -> PN ;
|
||||
FemaleSurname : SN -> PN ;
|
||||
PlSurname : SN -> PN ;
|
||||
FullName : GN -> SN -> PN ;
|
||||
|
||||
}
|
||||
|
||||
@@ -20,11 +20,13 @@
|
||||
abstract Numeral = Cat [Numeral,Digits] ** {
|
||||
|
||||
cat
|
||||
Digit ; -- 2..9
|
||||
Sub10 ; -- 1..9
|
||||
Sub100 ; -- 1..99
|
||||
Sub1000 ; -- 1..999
|
||||
Sub1000000 ; -- 1..999999
|
||||
Digit ; -- 2..9
|
||||
Sub10 ; -- 1..9
|
||||
Sub100 ; -- 1..99
|
||||
Sub1000 ; -- 1..999
|
||||
Sub1000000 ; -- 1..999999
|
||||
Sub1000000000 ; -- 1..999999999
|
||||
Sub1000000000000 ; -- 1..999999999999
|
||||
|
||||
data
|
||||
num : Sub1000000 -> Numeral ; -- 123456 [coercion to top category]
|
||||
@@ -33,18 +35,36 @@ data
|
||||
|
||||
pot01 : Sub10 ; -- 1
|
||||
pot0 : Digit -> Sub10 ; -- d * 1
|
||||
pot0as1 : Sub10 -> Sub100 ; -- coercion of 1..9
|
||||
|
||||
pot110 : Sub100 ; -- 10
|
||||
pot111 : Sub100 ; -- 11
|
||||
pot1to19 : Digit -> Sub100 ; -- 10 + d
|
||||
pot0as1 : Sub10 -> Sub100 ; -- coercion of 1..9
|
||||
pot1 : Digit -> Sub100 ; -- d * 10
|
||||
pot1plus : Digit -> Sub10 -> Sub100 ; -- d * 10 + n
|
||||
pot1as2 : Sub100 -> Sub1000 ; -- coercion of 1..99
|
||||
|
||||
pot21 : Sub1000 ; -- a hundred instead of one hundred
|
||||
pot2 : Sub10 -> Sub1000 ; -- m * 100
|
||||
pot2plus : Sub10 -> Sub100 -> Sub1000 ; -- m * 100 + n
|
||||
pot2as3 : Sub1000 -> Sub1000000 ; -- coercion of 1..999
|
||||
|
||||
pot31 : Sub1000000 ; -- a thousand instead of one thousand
|
||||
pot3 : Sub1000 -> Sub1000000 ; -- m * 1000
|
||||
pot3plus : Sub1000 -> Sub1000 -> Sub1000000 ; -- m * 1000 + n
|
||||
pot3as4 : Sub1000000 -> Sub1000000000 ; -- coercion of 1..999999
|
||||
pot3float : Float -> Sub1000000 ; -- 3.5 thousand
|
||||
|
||||
pot41 : Sub1000000000 ; -- a million instead of one million
|
||||
pot4 : Sub1000 -> Sub1000000000 ; -- m * 1000000000
|
||||
pot4plus : Sub1000 -> Sub1000000 -> Sub1000000000 ; -- m * 1000000000 + n
|
||||
pot4as5 : Sub1000000000 -> Sub1000000000000 ; -- coercion of 1..999999999
|
||||
pot4float : Float -> Sub1000000000 ; -- 3.5 million
|
||||
|
||||
pot51 : Sub1000000000000 ; -- a billion instead of one billion
|
||||
pot5 : Sub1000 -> Sub1000000000000 ; -- m * 1000000000
|
||||
pot5plus : Sub1000 -> Sub1000000000 -> Sub1000000000000 ; -- m * 1000000000 + n
|
||||
pot5float : Float -> Sub1000000000000 ; -- 3.5 billion
|
||||
|
||||
-- Numerals as sequences of digits have a separate, simpler grammar
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
concrete AllAfr of AllAfrAbs =
|
||||
LangAfr,
|
||||
IrregAfr,
|
||||
ExtraAfr
|
||||
ExtendAfr
|
||||
**
|
||||
{
|
||||
--{} ;
|
||||
|
||||
@@ -83,6 +83,6 @@ concrete CatAfr of Cat =
|
||||
N = Noun ;
|
||||
N2 = {s : NForm => Str ; g : Gender} ** {c2 : Preposition} ;
|
||||
N3 = {s : NForm => Str ; g : Gender} ** {c2,c3 : Preposition} ;
|
||||
PN = {s : NPCase => Str} ;
|
||||
GN, SN, PN = {s : NPCase => Str} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -28,6 +28,18 @@ lin
|
||||
s2 = paragraph (pn.s ! NPNom)
|
||||
} ;
|
||||
|
||||
InflectionGN = \pn -> {
|
||||
t = "vnm" ;
|
||||
s1 = heading1 "Voornaam" ;
|
||||
s2 = paragraph (pn.s ! NPNom)
|
||||
} ;
|
||||
|
||||
InflectionSN = \pn -> {
|
||||
t = "van" ;
|
||||
s1 = heading1 "Van" ;
|
||||
s2 = paragraph (pn.s ! NPNom)
|
||||
} ;
|
||||
|
||||
InflectionA, InflectionA2 = \adj ->
|
||||
let
|
||||
gforms : AForm -> Str = \a ->
|
||||
|
||||
14
src/afrikaans/ExtendAfr.gf
Normal file
14
src/afrikaans/ExtendAfr.gf
Normal file
@@ -0,0 +1,14 @@
|
||||
concrete ExtendAfr of Extend =
|
||||
CatAfr ** ExtendFunctor
|
||||
with
|
||||
(Grammar = GrammarAfr) **
|
||||
|
||||
open
|
||||
ResAfr in {
|
||||
|
||||
lin GivenName, MaleSurname, FemaleSurname = \n -> n ;
|
||||
lin FullName gn sn = {
|
||||
s = \\c => gn.s ! NPNom ++ sn.s ! c ;
|
||||
} ;
|
||||
|
||||
}
|
||||
@@ -7,7 +7,7 @@ flags optimize = all_subs ;
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str ; en : Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ;
|
||||
Sub100, Sub1000, Sub1000000 =
|
||||
Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
|
||||
{s : CardOrd => Str ; n : Number ; attr : Str} ;
|
||||
|
||||
lin
|
||||
@@ -50,6 +50,8 @@ lin
|
||||
pot3plus n m =
|
||||
addAttr {s = \\g => n.attr ++ "duisend" ++ m.s ! g ; n = Pl} ;
|
||||
|
||||
pot3as4 n = n ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
|
||||
@@ -323,8 +323,8 @@ concrete ExtraGrc of ExtraGrcAbs = CatGrc, NumeralGrc[Sub1000000,tenthousand] **
|
||||
Sub10000 = {s : CardOrd => Str ; n : Number} ; -- TODO: constructors
|
||||
|
||||
lin -- d * 10000
|
||||
pot4 d = { s = \\f => d.s ! NAdv ++ (tenthousand ! f) ; n = Pl } ;
|
||||
pot4plus d m = {
|
||||
pot3X d = { s = \\f => d.s ! NAdv ++ (tenthousand ! f) ; n = Pl } ;
|
||||
pot3Xplus d m = {
|
||||
s = \\f => d.s ! NAdv ++ tenthousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ;
|
||||
|
||||
|
||||
|
||||
@@ -153,8 +153,8 @@ abstract ExtraGrcAbs = Extra, Numeral[Sub1000000] ** {
|
||||
Sub10000 ; -- 1..9999
|
||||
|
||||
data
|
||||
pot4 : Sub10000 -> Sub1000000 ; -- m * 10000
|
||||
pot4plus : Sub10000 -> Sub10000 -> Sub1000000 ; -- m * 10000 + n
|
||||
pot3X : Sub10000 -> Sub1000000 ; -- m * 10000
|
||||
pot3Xplus : Sub10000 -> Sub10000 -> Sub1000000 ; -- m * 10000 + n
|
||||
|
||||
-- Conjunctions:
|
||||
|
||||
|
||||
@@ -5,9 +5,11 @@ concrete NumeralGrc of Numeral = CatGrc ** open ResGrc, MorphoGrc in {
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str ; n : Number} ;
|
||||
Sub100 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub100 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
lin num x = x ;
|
||||
|
||||
@@ -52,6 +54,8 @@ lin -- mkDigit d (d+10) (d*10) d-th d-times
|
||||
pot3plus d m = {
|
||||
s = \\f => d.s ! NAdv ++ thousand ! f ++ "kai`" ++ m.s ! f ; n = Pl} ;
|
||||
|
||||
pot3as4 n = n ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
-- numerals as sequences of digits
|
||||
|
||||
|
||||
9
src/api/CombinatorsHrv.gf
Normal file
9
src/api/CombinatorsHrv.gf
Normal file
@@ -0,0 +1,9 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource CombinatorsHrv = Combinators with
|
||||
(Cat = CatHrv),
|
||||
(Structural = StructuralHrv),
|
||||
(Constructors = ConstructorsHrv)
|
||||
** open MissingHrv in {}
|
||||
|
||||
|
||||
9
src/api/CombinatorsTam.gf
Normal file
9
src/api/CombinatorsTam.gf
Normal file
@@ -0,0 +1,9 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource CombinatorsTam = Combinators - [ appCN, appCNc ] with
|
||||
(Cat = CatTam),
|
||||
(Structural = StructuralTam),
|
||||
(Noun = NounTam),
|
||||
(Constructors = ConstructorsTam) **
|
||||
{}
|
||||
}
|
||||
@@ -121,9 +121,9 @@ incomplete resource Constructors = open Grammar in { --%
|
||||
mkText : QS -> Text -- Did she sleep?
|
||||
= \q -> TQuestMark (PhrUtt NoPConj (UttQS q) NoVoc) TEmpty ; --%
|
||||
mkText : (Pol) -> Imp -> Text -- Don't sleep!
|
||||
= \p,i -> TExclMark (PhrUtt NoPConj (UttImpSg p i) NoVoc) TEmpty; --%
|
||||
= \p,i -> TExclMark (PhrUtt NoPConj (UttImpSg p i) NoVoc) TEmpty ; --%
|
||||
mkText : Imp -> Text -- Sleep! --%
|
||||
= \i -> TExclMark (PhrUtt NoPConj (UttImpSg PPos i) NoVoc) TEmpty; --%
|
||||
= \i -> TExclMark (PhrUtt NoPConj (UttImpSg PPos i) NoVoc) TEmpty ; --%
|
||||
|
||||
-- Finally, two texts can be combined into a text.
|
||||
|
||||
@@ -374,11 +374,11 @@ incomplete resource Constructors = open Grammar in { --%
|
||||
mkCl = overload {
|
||||
|
||||
mkCl : NP -> V -> Cl -- she sleeps
|
||||
= \s,v -> PredVP s (UseV v); --%
|
||||
= \s,v -> PredVP s (UseV v) ; --%
|
||||
mkCl : NP -> V2 -> NP -> Cl -- she loves him
|
||||
= \s,v,o -> PredVP s (ComplV2 v o); --%
|
||||
= \s,v,o -> PredVP s (ComplV2 v o) ; --%
|
||||
mkCl : NP -> V3 -> NP -> NP -> Cl -- she sends it to him
|
||||
= \s,v,o,i -> PredVP s (ComplV3 v o i); --%
|
||||
= \s,v,o,i -> PredVP s (ComplV3 v o i) ; --%
|
||||
mkCl : NP -> VV -> VP -> Cl -- she wants to sleep
|
||||
= \s,v,vp -> PredVP s (ComplVV v vp) ; --%
|
||||
mkCl : NP -> VS -> S -> Cl -- she says that she sleeps
|
||||
@@ -1006,9 +1006,9 @@ incomplete resource Constructors = open Grammar in { --%
|
||||
|
||||
|
||||
mkCN : A -> N -> CN -- big house
|
||||
= \x,y -> AdjCN (PositA x) (UseN y); --%
|
||||
= \x,y -> AdjCN (PositA x) (UseN y) ; --%
|
||||
mkCN : A -> CN -> CN -- big blue house
|
||||
= \x,y -> AdjCN (PositA x) y; --%
|
||||
= \x,y -> AdjCN (PositA x) y ; --%
|
||||
mkCN : AP -> N -> CN -- very big house
|
||||
= \x,y -> AdjCN x (UseN y) ; --%
|
||||
mkCN : AP -> CN -> CN -- very big blue house
|
||||
@@ -1211,11 +1211,11 @@ incomplete resource Constructors = open Grammar in { --%
|
||||
mkQCl : IP -> VP -> QCl -- who sleeps --:
|
||||
= QuestVP ; --%
|
||||
mkQCl : IP -> V -> QCl -- who sleeps
|
||||
= \s,v -> QuestVP s (UseV v); --%
|
||||
= \s,v -> QuestVP s (UseV v) ; --%
|
||||
mkQCl : IP -> V2 -> NP -> QCl -- who loves her
|
||||
= \s,v,o -> QuestVP s (ComplV2 v o); --%
|
||||
= \s,v,o -> QuestVP s (ComplV2 v o) ; --%
|
||||
mkQCl : IP -> V3 -> NP -> NP -> QCl -- who sends it to her
|
||||
= \s,v,o,i -> QuestVP s (ComplV3 v o i); --%
|
||||
= \s,v,o,i -> QuestVP s (ComplV3 v o i) ; --%
|
||||
mkQCl : IP -> VV -> VP -> QCl -- who wants to sleep
|
||||
= \s,v,vp -> QuestVP s (ComplVV v vp) ; --%
|
||||
mkQCl : IP -> VS -> S -> QCl -- who says that she sleeps
|
||||
@@ -1408,11 +1408,11 @@ incomplete resource Constructors = open Grammar in { --%
|
||||
= RelVP ; --%
|
||||
|
||||
mkRCl : RP -> V -> RCl -- who sleeps
|
||||
= \s,v -> RelVP s (UseV v); --%
|
||||
= \s,v -> RelVP s (UseV v) ; --%
|
||||
mkRCl : RP -> V2 -> NP -> RCl -- who loves her
|
||||
= \s,v,o -> RelVP s (ComplV2 v o); --%
|
||||
= \s,v,o -> RelVP s (ComplV2 v o) ; --%
|
||||
mkRCl : RP -> V3 -> NP -> NP -> RCl -- who sends it to her
|
||||
= \s,v,o,i -> RelVP s (ComplV3 v o i); --%
|
||||
= \s,v,o,i -> RelVP s (ComplV3 v o i) ; --%
|
||||
mkRCl : RP -> VV -> VP -> RCl -- who wants to sleep
|
||||
= \s,v,vp -> RelVP s (ComplVV v vp) ; --%
|
||||
mkRCl : RP -> VS -> S -> RCl -- who says that she sleeps
|
||||
|
||||
5
src/api/ConstructorsHrv.gf
Normal file
5
src/api/ConstructorsHrv.gf
Normal file
@@ -0,0 +1,5 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
resource ConstructorsHrv = Constructors with (Grammar = GrammarHrv)
|
||||
** open MissingHrv in {}
|
||||
|
||||
5
src/api/ConstructorsTam.gf
Normal file
5
src/api/ConstructorsTam.gf
Normal file
@@ -0,0 +1,5 @@
|
||||
--# -path=.:alltenses:prelude:../tamil
|
||||
|
||||
resource ConstructorsTam = Constructors with (Grammar = GrammarTam) **
|
||||
open MissingTam in {} ;
|
||||
}
|
||||
6
src/api/SymbolicHrv.gf
Normal file
6
src/api/SymbolicHrv.gf
Normal file
@@ -0,0 +1,6 @@
|
||||
--# -path=.:../slovak:../common:../abstract:../prelude
|
||||
|
||||
resource SymbolicHrv = Symbolic with
|
||||
(Symbol = SymbolHrv),
|
||||
(Grammar = GrammarHrv)
|
||||
** open MissingHrv in {}
|
||||
6
src/api/SymbolicTam.gf
Normal file
6
src/api/SymbolicTam.gf
Normal file
@@ -0,0 +1,6 @@
|
||||
--# -path=.:../tamil:../common:../abstract:../prelude
|
||||
|
||||
resource SymbolicTam = Symbolic with
|
||||
(Symbol = SymbolTam),
|
||||
(Grammar = GrammarTam) ** open MissingTam in {} ;
|
||||
}
|
||||
4
src/api/SyntaxHrv.gf
Normal file
4
src/api/SyntaxHrv.gf
Normal file
@@ -0,0 +1,4 @@
|
||||
--# -path=.:./alltenses:../prelude
|
||||
|
||||
instance SyntaxHrv of Syntax =
|
||||
ConstructorsHrv, CatHrv, StructuralHrv, CombinatorsHrv ;
|
||||
6
src/api/SyntaxTam.gf
Normal file
6
src/api/SyntaxTam.gf
Normal file
@@ -0,0 +1,6 @@
|
||||
--# -path=.:alltenses:prelude
|
||||
|
||||
instance SyntaxTam of Syntax =
|
||||
ConstructorsTam, CatTam, StructuralTam, CombinatorsTam ;
|
||||
|
||||
}
|
||||
13
src/api/TryHrv.gf
Normal file
13
src/api/TryHrv.gf
Normal file
@@ -0,0 +1,13 @@
|
||||
--# -path=.:../slovak:../common:../abstract:../prelude
|
||||
|
||||
resource TryHrv = SyntaxHrv, LexiconHrv, ParadigmsHrv -[mkAdv, mkAdN, mkOrd, mkDet, mkQuant]**
|
||||
open (P = ParadigmsHrv) in {
|
||||
|
||||
-- oper
|
||||
|
||||
-- mkAdv = overload SyntaxHrv {
|
||||
-- mkAdv : Str -> Adv = P.mkAdv ;
|
||||
-- } ;
|
||||
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
--# -path=.:../russian:../common:../abstract:../prelude
|
||||
|
||||
resource TryRus = SyntaxRus, LexiconRus, ParadigmsRus - [mkAdv,mkIAdv,mkOrd] ;
|
||||
resource TryRus = SyntaxRus, LexiconRus, ParadigmsRus - [mkAdv,mkIAdv,mkOrd,mkAdN] ;
|
||||
|
||||
4
src/api/TryTam.gf
Normal file
4
src/api/TryTam.gf
Normal file
@@ -0,0 +1,4 @@
|
||||
--# -path=.:../tamil :../common:../abstract:../prelude
|
||||
|
||||
resource TryTam = SyntaxTam, LexiconTam, ParadigmsTam - [mkAdv,mkAdN,mkOrd,mkNum] ;
|
||||
}
|
||||
@@ -81,7 +81,7 @@ incomplete concrete CatBantu of Cat =
|
||||
-- N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Str} ;
|
||||
N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Prep} ;
|
||||
N3 = {s : Number => Case => Str ; g : Gender} ** {c2,c3 : Prep} ;
|
||||
PN = {s : Case => Str ; g : Gender} ;
|
||||
GN, SN, PN = {s : Case => Str ; g : Gender} ;
|
||||
--Tense = {s : Str ; t : ResKam.Tense} ;
|
||||
|
||||
linref
|
||||
|
||||
@@ -86,6 +86,8 @@ concrete CatBul of Cat = CommonX - [IAdv,AdV] ** open ResBul, Prelude, Predef, (
|
||||
N = {s : NForm => Str; rel : AForm => Str; relType : NRelType; g : AGender} ;
|
||||
N2 = {s : NForm => Str; rel : AForm => Str; relType : NRelType; g : AGender} ** {c2 : Preposition} ;
|
||||
N3 = {s : NForm => Str; rel : AForm => Str; relType : NRelType; g : AGender} ** {c2,c3 : Preposition} ;
|
||||
GN = {s : Str; g : Sex} ;
|
||||
SN = {s : Sex => Str; pl : Str} ;
|
||||
PN = {s : Str; gn : GenNum} ;
|
||||
|
||||
lindef
|
||||
|
||||
@@ -92,6 +92,26 @@ lin
|
||||
s3 = ""
|
||||
} ;
|
||||
|
||||
InflectionGN = \gn -> {
|
||||
t = "същ.с.л." ;
|
||||
s1= heading1 (case gn.g of {
|
||||
Male => "Мъжко Име" ;
|
||||
Female => "Женско Име"
|
||||
}) ;
|
||||
s2 = gn.s ;
|
||||
s3 = ""
|
||||
} ;
|
||||
|
||||
InflectionSN = \sn -> {
|
||||
t = "същ.с.ф." ;
|
||||
s1= heading1 ("Фамилно Име") ;
|
||||
s2 = frameTable (
|
||||
tr (th "мъжко" ++ td (sn.s ! Male)) ++
|
||||
tr (th "женско" ++ td (sn.s ! Female)) ++
|
||||
tr (th "семейно" ++ td sn.pl)) ;
|
||||
s3 = ""
|
||||
} ;
|
||||
|
||||
InflectionA, InflectionA2 = \a -> {
|
||||
t = "пр" ;
|
||||
s1= heading1 ("Прилагателно") ;
|
||||
|
||||
@@ -300,5 +300,26 @@ lin UseDAP dap = {
|
||||
p = NounP3 dap.p
|
||||
} ;
|
||||
|
||||
lin GivenName = \n -> {
|
||||
s = n.s ;
|
||||
gn = GSg (sex2gender n.g)
|
||||
} ;
|
||||
lin MaleSurname = \n -> {
|
||||
s = n.s ! Male ;
|
||||
gn = GSg Masc
|
||||
} ;
|
||||
lin FemaleSurname = \n -> {
|
||||
s = n.s ! Female;
|
||||
gn = GSg Fem
|
||||
} ;
|
||||
lin PlSurname = \n -> {
|
||||
s = n.pl ;
|
||||
gn = GPl
|
||||
} ;
|
||||
lin FullName gn sn = {
|
||||
s = gn.s ++ sn.s ! gn.g ;
|
||||
gn = GSg (sex2gender gn.g)
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -266,7 +266,25 @@ oper
|
||||
|
||||
--2 Proper Names
|
||||
--
|
||||
|
||||
masculine : Gender = Masc ;
|
||||
feminine : Gender = Fem ;
|
||||
neutr : Gender = Neut ;
|
||||
|
||||
male : Sex = Male ;
|
||||
female : Sex = Female ;
|
||||
|
||||
mkGN : Str -> Sex -> GN =
|
||||
\s,g -> lin GN {s = s; g = g} ;
|
||||
mkSN = overload {
|
||||
mkSN : Str -> SN =
|
||||
\s -> lin SN {s = \\_ => s; pl = s} ;
|
||||
mkSN : Str -> Str -> Str -> SN =
|
||||
\m,f,pl -> lin SN {s = table Sex [m; f]; pl = pl} ;
|
||||
} ;
|
||||
|
||||
mkPN = overload {
|
||||
mkPN : Str -> PN = \s -> {s = s; gn = GSg Masc ; lock_PN = <>} ;
|
||||
mkPN : Str -> Gender -> PN =
|
||||
\s,g -> {s = s; gn = GSg g ; lock_PN = <>} ;
|
||||
mkPN : Str -> GenNum -> PN =
|
||||
|
||||
@@ -4,11 +4,13 @@ concrete NumeralBul of Numeral = CatBul [Numeral,Digits] ** open Prelude, ResBul
|
||||
|
||||
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
|
||||
Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
||||
Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
||||
Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ;
|
||||
Digit = {s : DForm => CardOrd => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str; n : Number} ;
|
||||
Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
||||
Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ;
|
||||
Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ;
|
||||
Sub1000000000 = {s : CardOrd => NumF => Str; n : Number} ;
|
||||
Sub1000000000000 = {s : CardOrd => NumF => Str; n : Number} ;
|
||||
|
||||
lin num x = {s = \\c => x.s ! c ! Formal; n=x.n} ;
|
||||
lin n2 = mkDigit "два" "двама" "две" "втори" "двайсет" "двеста" "двестата" ;
|
||||
@@ -52,24 +54,33 @@ lin pot01 =
|
||||
;n = Sg
|
||||
} ;
|
||||
lin pot0 d = d ** {n = Pl} ;
|
||||
lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ;
|
||||
|
||||
lin pot110 = {s=\\c,nf => pot01.s ! ten nf ! c; n = Pl; i = True} ;
|
||||
lin pot111 = {s=\\c,nf => pot01.s ! teen nf ! c; n = Pl; i = True} ;
|
||||
lin pot1to19 d = {s = \\c,nf => d.s ! teen nf ! c; n = Pl; i = True} ;
|
||||
lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ;
|
||||
lin pot1 d = {s = \\c,nf => d.s ! ten nf ! c; n = Pl; i = True} ;
|
||||
lin pot1plus d e = {
|
||||
s = \\c,nf => d.s ! ten nf ! NCard (CFMasc Indef NonHuman) ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ;
|
||||
|
||||
lin pot1as2 n = n ;
|
||||
|
||||
lin pot21 = {
|
||||
s = \\o,_ => mkCardOrd100 "сто" "стоте" "стотен" ! o ;
|
||||
i = False ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot2 n = {s = \\c,nf => n.s ! hundred ! c; n = Pl; i = True} ;
|
||||
lin pot2plus d e = {
|
||||
s = \\c,nf => d.s ! hundred ! NCard (CFMasc Indef NonHuman) ++ case e.i of {False => []; True => "и"} ++ e.s ! c ! nf ;
|
||||
n = Pl ;
|
||||
i = False
|
||||
} ;
|
||||
|
||||
lin pot2as3 n = n ;
|
||||
|
||||
lin pot31 = {
|
||||
s = \\o,_ => mkCardOrd100 "хиляда" "хилядата" "хиляден" ! o ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot3 n = {
|
||||
s = \\c,nf => case n.n of {
|
||||
Sg => mkCardOrd100 "хиляда" "хилядата" "хиляден" ! c ;
|
||||
@@ -85,7 +96,52 @@ lin pot3plus n m = {
|
||||
++ case m.i of {False => []; True => "и"} ++ m.s ! c ! nf ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot3as4 n = n ;
|
||||
lin pot3float f = {
|
||||
s = \\c,nf => f.s ++ mkCardOrd100 "хиляди" "хилядите" "хиляден" ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
lin pot41 = {
|
||||
s = \\o,_ => mkCardOrd100 "милион" "милионите" "милионен" ! o ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4 n = {
|
||||
s = \\c,nf => case n.n of {
|
||||
Sg => mkCardOrd100 "милион" "милионите" "милионен" ! c ;
|
||||
Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "милиони" "милионите" "милионен" ! c
|
||||
} ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4plus n1 n2 = {
|
||||
s = \\o,f => (pot4 n1).s ! o ! f ++ "и" ++ n2.s ! o ! f;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4as5 n = n ;
|
||||
lin pot4float f = {
|
||||
s = \\c,nf => f.s ++ mkCardOrd100 "милиона" "милиона" "милионен" ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
lin pot51 = {
|
||||
s = \\o,_ => mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! o ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5 n = {
|
||||
s = \\c,nf => case n.n of {
|
||||
Sg => mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! c ;
|
||||
Pl => n.s ! NCard (CFFem Indef) ! nf ++ mkCardOrd100 "милиярд" "милиярдите" "милиярден" ! c
|
||||
} ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5plus n1 n2 = {
|
||||
s = \\o,f => (pot5 n1).s ! o ! f ++ "и" ++ n2.s ! o ! f;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5float f = {
|
||||
s = \\c,nf => f.s ++ mkCardOrd100 "милиярда" "милиярда" "милиярден" ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
|
||||
-- numerals as sequences of digits
|
||||
|
||||
|
||||
@@ -47,7 +47,8 @@ resource ResBul = ParamX ** open Prelude, Predef in {
|
||||
|
||||
param
|
||||
Gender = Masc | Fem | Neut ;
|
||||
|
||||
Sex = Male | Female ;
|
||||
|
||||
Species = Indef | Def ;
|
||||
|
||||
-- The plural never makes a gender distinction.
|
||||
@@ -851,4 +852,11 @@ resource ResBul = ParamX ** open Prelude, Predef in {
|
||||
APl Indef => "свои" ;
|
||||
APl Def => "своите"
|
||||
} ;
|
||||
|
||||
sex2gender : Sex -> Gender = \g ->
|
||||
case g of {
|
||||
Male => Masc ;
|
||||
Female => Fem
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -15,5 +15,10 @@ concrete ExtendCat of Extend = CatCat ** ExtendRomanceFunctor-- -
|
||||
ParadigmsCat in {
|
||||
-- put your own definitions here
|
||||
|
||||
lin GivenName, MaleSurname, FemaleSurname = \n -> n ;
|
||||
lin FullName gn sn = {
|
||||
s = gn.s ++ sn.s ;
|
||||
g = gn.g
|
||||
} ;
|
||||
|
||||
} ;
|
||||
|
||||
@@ -12,6 +12,8 @@ lincat
|
||||
Sub100 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
Sub1000000000000 = {s : CardOrd => Str ; n : Number} ;
|
||||
|
||||
|
||||
-- Auxiliaries
|
||||
@@ -125,7 +127,9 @@ lin
|
||||
pot3plus n m =
|
||||
{s= \\co => (table {Sg => []; Pl => (n.s ! co)} ! n.n) ++ "mil" ++ (m.s !co);
|
||||
n= Pl} ;
|
||||
|
||||
|
||||
pot3as4 n = n ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
param
|
||||
DForm = unit | teen | ten | tenplus | Aunit | OrdF ;
|
||||
|
||||
@@ -79,7 +79,7 @@ concrete CatChi of Cat = CommonX - [Tense, Temp, Ant, Adv] ** open ResChi, Prelu
|
||||
N = ResChi.Noun ;
|
||||
N2 = ResChi.Noun ** {c2 : Preposition} ;
|
||||
N3 = ResChi.Noun ** {c2,c3 : Preposition} ;
|
||||
PN = ResChi.NP ;
|
||||
GN, SN, PN = ResChi.NP ;
|
||||
|
||||
-- overridden
|
||||
|
||||
|
||||
@@ -16,4 +16,10 @@ concrete ExtendChi of Extend = CatChi **
|
||||
oper
|
||||
mkAdv : Str -> Adv ;
|
||||
mkAdv str = lin Adv {s = str ; advType = ATManner ; hasDe = False} ;
|
||||
};
|
||||
|
||||
lin GivenName, MaleSurname, FemaleSurname, PlSurname = \n -> n ;
|
||||
lin FullName gn sn = {
|
||||
s = gn.s ++ sn.s
|
||||
} ;
|
||||
|
||||
};
|
||||
|
||||
@@ -20,7 +20,7 @@ lincat Digit = {s,p : Str} ; -- s/p: without/with classifier (er/liang)
|
||||
lincat Sub10 = {s,p,t : Str} ; -- t: with "shi wan"
|
||||
lincat Sub100 = {end0,beg0 : Zero ; s,p : Bform => Str} ; -- end0: ends with zeros, e.g. 20 ; beg0: begins with zeros, e.g. 02
|
||||
lincat Sub1000 = {end0,beg0 : Zero ; s,p : Qform => Str} ; -- end0: ends with zeros, e.g. 210 ; beg0: begins with zeros, e.g. 021
|
||||
lincat Sub1000000 = {s,p : Str} ;
|
||||
lincat Sub1000000, Sub1000000000, Sub1000000000000 = {s,p : Str} ;
|
||||
lin num x0 = x0 ;
|
||||
|
||||
-- 一二三四五六七八九十一百千
|
||||
@@ -137,7 +137,9 @@ lin pot3 n =
|
||||
{s,p = n.s ! shiwan} ;
|
||||
lin pot3plus n m =
|
||||
{s,p = (n.s ! shiwan0) ++ (ling ! <n.end0,m.beg0>) ++ m.s ! bai0} ;
|
||||
lin pot3as4 n = n ;
|
||||
|
||||
lin pot4as5 n = n ;
|
||||
|
||||
-- numerals as sequences of digits
|
||||
|
||||
|
||||
33
src/croatian/AdjectiveHrv.gf
Normal file
33
src/croatian/AdjectiveHrv.gf
Normal file
@@ -0,0 +1,33 @@
|
||||
concrete AdjectiveHrv of Adjective = CatHrv ** open ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
|
||||
PositA a = adjFormsAdjective a.posit ** {isPost = False} ;
|
||||
|
||||
AdAP ada ap = ap ** {s = \\g,n,c => ada.s ++ ap.s ! g ! n ! c} ;
|
||||
|
||||
AdjOrd a = adjFormsAdjective a ** {isPost = False} ;
|
||||
|
||||
ComparA a np =
|
||||
let ap = adjFormsAdjective a.compar
|
||||
in
|
||||
ap ** {
|
||||
s = \\g,n,c => ap.s ! g ! n ! c ++ od_Str ++ np.s ! Gen ;
|
||||
isPost = True ;
|
||||
} ;
|
||||
|
||||
ComplA2 a np =
|
||||
let ap = adjFormsAdjective a
|
||||
in
|
||||
ap ** {
|
||||
s = \\g,n,c => ap.s ! g ! n ! c ++ a.c.s ++ np.s ! a.c.c ;
|
||||
isPost = True ;
|
||||
} ;
|
||||
|
||||
UseA2 a = adjFormsAdjective a ** {isPost = False} ;
|
||||
|
||||
UseComparA a = adjFormsAdjective a.compar ** {isPost = False} ;
|
||||
|
||||
AdvAP ap adv = ap ** {s = \\g,n,c => ap.s ! g ! n ! c ++ adv.s ; isPost = True} ;
|
||||
|
||||
}
|
||||
9
src/croatian/AdverbHrv.gf
Normal file
9
src/croatian/AdverbHrv.gf
Normal file
@@ -0,0 +1,9 @@
|
||||
concrete AdverbHrv of Adverb = CatHrv **
|
||||
open ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
PrepNP prep np = {
|
||||
s = prep.s ++ np.prep ! prep.c
|
||||
} ;
|
||||
AdnCAdv a = a ;
|
||||
}
|
||||
8
src/croatian/AllHrv.gf
Normal file
8
src/croatian/AllHrv.gf
Normal file
@@ -0,0 +1,8 @@
|
||||
--# -path=.:../abstract:../common:../api
|
||||
|
||||
concrete AllHrv of AllHrvAbs =
|
||||
LangHrv,
|
||||
ExtendHrv,
|
||||
MissingHrv
|
||||
;
|
||||
|
||||
7
src/croatian/AllHrvAbs.gf
Normal file
7
src/croatian/AllHrvAbs.gf
Normal file
@@ -0,0 +1,7 @@
|
||||
--# -path=.:../abstract:../common:prelude
|
||||
|
||||
abstract AllHrvAbs =
|
||||
Lang,
|
||||
Extend
|
||||
;
|
||||
|
||||
72
src/croatian/CatHrv.gf
Normal file
72
src/croatian/CatHrv.gf
Normal file
@@ -0,0 +1,72 @@
|
||||
concrete CatHrv of Cat =
|
||||
--- CommonX **
|
||||
|
||||
open ResHrv, Prelude in {
|
||||
|
||||
lincat
|
||||
Text = {s : Str} ;
|
||||
Phr = {s : Str} ;
|
||||
Utt = {s : Str} ;
|
||||
|
||||
S = {s : Str} ;
|
||||
Cl = {subj,clit,compl : Str ; verb : VerbForms ; a : Agr} ;
|
||||
Comp = {s : Agr => Str} ;
|
||||
|
||||
QS = {s : Str} ; ---- TODO: indirect questions
|
||||
QCl = {subj,clit,compl : Str ; verb : VerbForms ; a : Agr} ; -- = Cl ---- check if enough
|
||||
IAdv = {s : Str} ;
|
||||
|
||||
RS = {s : Agr => Str} ;
|
||||
RCl = {subj,clit,compl : Agr => Str ; verb : VerbForms} ; ---- RAgr with composite RP
|
||||
RP = AdjForms ;
|
||||
|
||||
VP = {verb : VerbForms ; clit,compl : Agr => Str} ; ---- more fields probably needed
|
||||
VPSlash = {verb : VerbForms ; clit,compl : Agr => Str ; c : ComplementCase} ; ----
|
||||
V = {s : VerbForms} ;
|
||||
V2 = {s : VerbForms ; c : ComplementCase} ;
|
||||
VS,VQ = {s : VerbForms} ;
|
||||
|
||||
A = {posit, compar, superl : AdjForms} ;
|
||||
AP = ResHrv.Adjective ** {isPost : Bool} ; -- {s : Gender => Number => Case => Str}
|
||||
A2 = ResHrv.AdjForms ** {c : ComplementCase} ;
|
||||
|
||||
AdA = {s : Str} ;
|
||||
|
||||
N = ResHrv.NounForms ** {g : Gender} ;
|
||||
CN = ResHrv.Noun ; -- {s : Number => Case => Str ; g : Gender}
|
||||
NP = {s,clit,prep : Case => Str ; a : Agr ; hasClit : Bool} ; -- clit,prep differ for pronouns
|
||||
PN = {s : Case => Str ; g : Gender} ;
|
||||
Det = Determiner ; -- {s : Gender => Case => Str ; size : NumSize} ; -- can contain a numeral, therefore NumSize
|
||||
Quant = {s : Gender => Number => Case => Str} ; -- same as AP
|
||||
Num = Determiner ;
|
||||
Card = Determiner ; -- {s : Gender => Case => Str ; size : NumSize} ;
|
||||
Ord = AdjForms ;
|
||||
Pron = PronForms ** {poss : AdjForms} ;
|
||||
|
||||
Adv = {s : Str} ;
|
||||
Prep = ResHrv.ComplementCase ; -- {s : Str ; c : Case ; hasPrep : Bool} ;
|
||||
Conj = {s1,s2 : Str} ; ---- may need a number
|
||||
|
||||
Pol = {s : Str ; p : Bool} ;
|
||||
Temp = {s : Str ; t : CTense} ;
|
||||
Tense = {s : Str ; t : CTense} ;
|
||||
Ant = {s : Str ; t : CTense} ;
|
||||
|
||||
PConj = {s : Str} ;
|
||||
Voc = {s : Str} ;
|
||||
|
||||
AdN = {s : Str} ;
|
||||
AdV = {s : Str} ;
|
||||
CAdv = {s : Str} ;
|
||||
SC = {s : Str} ;
|
||||
|
||||
linref
|
||||
N = \s -> s.snom ;
|
||||
A = \s -> s.posit.msnom ;
|
||||
V = \v -> v.s ! VInf ;
|
||||
|
||||
|
||||
lincat Numeral = {s : AdjForms ; size : NumSize} ;
|
||||
lincat Digits = {s : Str ; size : NumSize} ;
|
||||
|
||||
}
|
||||
56
src/croatian/ConjunctionHrv.gf
Normal file
56
src/croatian/ConjunctionHrv.gf
Normal file
@@ -0,0 +1,56 @@
|
||||
concrete ConjunctionHrv of Conjunction = CatHrv **
|
||||
open ResHrv, Coordination, Prelude in {
|
||||
|
||||
lincat
|
||||
[Adv] = {s1,s2 : Str} ;
|
||||
[AP] = {s1,s2 : Gender => Number => Case => Str ; isPost : Bool} ;
|
||||
[NP] = {s1,s2,prep1,prep2 : Case => Str ; a : Agr} ;
|
||||
[S] = {s1,s2 : Str} ;
|
||||
[RS] = {s1,s2 : Agr => Str} ;
|
||||
|
||||
lin
|
||||
BaseAdv = twoSS ;
|
||||
ConsAdv = consrSS comma ;
|
||||
|
||||
BaseAP x y = twoTable3 Gender Number Case x y
|
||||
** {isPost = orB x.isPost y.isPost} ; ---- should be so in Pol too
|
||||
ConsAP x xs = consrTable3 Gender Number Case comma x xs
|
||||
** {isPost = orB x.isPost xs.isPost} ;
|
||||
|
||||
BaseNP x y = {
|
||||
s1 = x.s ;
|
||||
s2 = y.s ;
|
||||
prep1 = x.prep ;
|
||||
prep2 = y.prep ;
|
||||
a = y.a
|
||||
} ; -- clitics disappear ---- Agr TODO
|
||||
ConsNP x xs = {
|
||||
s1 = \\c => x.s ! c ++ comma ++ xs.s1 ! c ;
|
||||
s2 = xs.s2 ;
|
||||
prep1 = \\c => x.prep ! c ++ comma ++ xs.prep1 ! c ;
|
||||
prep2 = xs.prep2 ;
|
||||
a = xs.a ----
|
||||
} ;
|
||||
|
||||
BaseS = twoSS ;
|
||||
ConsS = consrSS comma ;
|
||||
|
||||
BaseRS = twoTable Agr ;
|
||||
ConsRS = consrTable Agr comma ;
|
||||
|
||||
ConjAdv = conjunctDistrSS ;
|
||||
|
||||
ConjAP conj xs = conjunctDistrTable3 Gender Number Case conj xs
|
||||
** {isPost = xs.isPost} ;
|
||||
|
||||
ConjNP conj xs = {
|
||||
s,clit = \\c => conj.s1 ++ xs.s1 ! c ++ conj.s2 ++ xs.s2 ! c ;
|
||||
prep = \\c => conj.s1 ++ xs.prep1 ! c ++ conj.s2 ++ xs.prep2 ! c ;
|
||||
a = xs.a ; ---- dep. on conj as well
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
ConjS = conjunctDistrSS ;
|
||||
ConjRS = conjunctDistrTable Agr ;
|
||||
|
||||
}
|
||||
43
src/croatian/ExtendHrv.gf
Normal file
43
src/croatian/ExtendHrv.gf
Normal file
@@ -0,0 +1,43 @@
|
||||
concrete ExtendHrv of Extend = CatHrv **
|
||||
ExtendFunctor - [
|
||||
--- ReflPossPron
|
||||
CardCNCard
|
||||
---- constant not found (yet)
|
||||
,youPolFem_Pron
|
||||
,UttVPShort
|
||||
,UttAccIP
|
||||
,UttDatIP
|
||||
,SubjRelNP
|
||||
,StrandRelSlash
|
||||
,StrandQuestSlash
|
||||
,SlashBareV2S
|
||||
,PredIAdvVP
|
||||
,PredAPVP
|
||||
,ExistsNP
|
||||
,ExistS
|
||||
,ExistPluralCN
|
||||
,ExistNPQS
|
||||
,ExistMassCN
|
||||
,ExistIPQS
|
||||
,ExistCN
|
||||
,EmptyRelSlash
|
||||
,DetNPMasc
|
||||
,DetNPFem
|
||||
,ComplBareVS
|
||||
,CompIQuant
|
||||
,CompBareCN
|
||||
]
|
||||
with (Grammar = GrammarHrv)
|
||||
**
|
||||
open
|
||||
ResHrv
|
||||
in {
|
||||
|
||||
---lin ReflPossPron = justDemPronFormsAdjective reflPossessivePron ;
|
||||
|
||||
lin CardCNCard card cn = {
|
||||
s = \\g,c => card.s ! g ! c ++ numSizeForm cn.s card.size c ;
|
||||
size = NS_20_
|
||||
} ;
|
||||
|
||||
}
|
||||
19
src/croatian/GrammarHrv.gf
Normal file
19
src/croatian/GrammarHrv.gf
Normal file
@@ -0,0 +1,19 @@
|
||||
--# -path=.:../abstract:../common:prelude
|
||||
|
||||
concrete GrammarHrv of Grammar =
|
||||
NounHrv,
|
||||
VerbHrv,
|
||||
AdjectiveHrv,
|
||||
AdverbHrv,
|
||||
NumeralHrv,
|
||||
SentenceHrv,
|
||||
QuestionHrv,
|
||||
RelativeHrv,
|
||||
ConjunctionHrv,
|
||||
PhraseHrv,
|
||||
TextHrv,
|
||||
StructuralHrv,
|
||||
IdiomHrv,
|
||||
TenseHrv
|
||||
** {
|
||||
}
|
||||
13
src/croatian/IdiomHrv.gf
Normal file
13
src/croatian/IdiomHrv.gf
Normal file
@@ -0,0 +1,13 @@
|
||||
concrete IdiomHrv of Idiom = CatHrv ** open Prelude, ResHrv in {
|
||||
|
||||
lin
|
||||
ExistNP np = { ---- TODO verify this
|
||||
subj = np.s ! Nom ;
|
||||
verb = copula_VerbForms ;
|
||||
clit, compl = [] ;
|
||||
a = np.a
|
||||
} ;
|
||||
|
||||
ExistNPAdv np adv = ExistNP np ** {compl = adv.s} ;
|
||||
|
||||
}
|
||||
10
src/croatian/LangHrv.gf
Normal file
10
src/croatian/LangHrv.gf
Normal file
@@ -0,0 +1,10 @@
|
||||
--# -path=.:../abstract:../common:../api
|
||||
|
||||
concrete LangHrv of Lang =
|
||||
GrammarHrv,
|
||||
LexiconHrv
|
||||
-- ,ConstructionHrv
|
||||
-- ,DocumentationHrv --# notpresent
|
||||
** {
|
||||
|
||||
}
|
||||
19
src/croatian/LexiconHrv.gf
Normal file
19
src/croatian/LexiconHrv.gf
Normal file
@@ -0,0 +1,19 @@
|
||||
concrete LexiconHrv of Lexicon =
|
||||
CatHrv
|
||||
**
|
||||
open
|
||||
ResHrv, ParadigmsHrv
|
||||
in {
|
||||
|
||||
|
||||
lin
|
||||
cat_N = mkN "mačka" ;
|
||||
black_A = mkA "crni" ;
|
||||
love_V2 = mkV2 (mkV "voljeti" "volim" "volio") ;
|
||||
see_V2 = mkV2 (mkV "vidjeti" "vidim" "vidio") ;
|
||||
walk_V = mkV "hodati" ;
|
||||
|
||||
man_N = mkN "čovjek" ;
|
||||
woman_N = mkN "žena" ;
|
||||
}
|
||||
|
||||
99
src/croatian/MissingHrv.gf
Normal file
99
src/croatian/MissingHrv.gf
Normal file
@@ -0,0 +1,99 @@
|
||||
resource MissingHrv = open GrammarHrv, SymbolHrv, Prelude, PredefCnc in {
|
||||
|
||||
-- temporary definitions to enable the compilation of RGL API
|
||||
oper AAnter : Ant = notYet "AAnter" ;
|
||||
oper AdAdv : AdA -> Adv -> Adv = notYet "AdAdv" ;
|
||||
oper AdVVP : AdV -> VP -> VP = notYet "AdVVP" ;
|
||||
oper AdvIAdv : IAdv -> Adv -> IAdv = notYet "AdvIAdv" ;
|
||||
oper AdvIP : IP -> Adv -> IP = notYet "AdvIP" ;
|
||||
oper AdvS : Adv -> S -> S = notYet "AdvS" ;
|
||||
oper AdvSlash : ClSlash -> Adv -> ClSlash = notYet "AdvSlash" ;
|
||||
oper CAdvAP : CAdv -> AP -> NP -> AP = notYet "CAdvAP" ;
|
||||
oper CleftAdv : Adv -> S -> Cl = notYet "CleftAdv" ;
|
||||
oper CleftNP : NP -> RS -> Cl = notYet "CleftNP" ;
|
||||
oper CompCN : CN -> Comp = notYet "CompCN" ;
|
||||
oper CompIAdv : IAdv -> IComp = notYet "CompIAdv" ;
|
||||
oper CompIP : IP -> IComp = notYet "CompIP" ;
|
||||
oper ComparAdvAdj : CAdv -> A -> NP -> Adv = notYet "ComparAdvAdj" ;
|
||||
oper ComparAdvAdjS : CAdv -> A -> S -> Adv = notYet "ComparAdvAdjS" ;
|
||||
oper ComplN2 : N2 -> NP -> CN = notYet "ComplN2" ;
|
||||
oper ComplN3 : N3 -> NP -> N2 = notYet "ComplN3" ;
|
||||
oper ComplVA : VA -> AP -> VP = notYet "ComplVA" ;
|
||||
oper ComplVQ : VQ -> QS -> VP = notYet "ComplVQ" ;
|
||||
oper ComplVS : VS -> S -> VP = notYet "ComplVS" ;
|
||||
oper ComplVV : VV -> VP -> VP = notYet "ComplVV" ;
|
||||
oper DetQuantOrd : Quant -> Num -> Ord -> Det = notYet "DetQuantOrd" ;
|
||||
oper EmbedQS : QS -> SC = notYet "EmbedQS" ;
|
||||
oper EmbedS : S -> SC = notYet "EmbedS" ;
|
||||
oper EmbedVP : VP -> SC = notYet "EmbedVP" ;
|
||||
oper ExistIP : IP -> QCl = notYet "ExistIP" ;
|
||||
oper FunRP : Prep -> NP -> RP -> RP = notYet "FunRP" ;
|
||||
oper GenericCl : VP -> Cl = notYet "GenericCl" ;
|
||||
oper IdetCN : IDet -> CN -> IP = notYet "IdetCN" ;
|
||||
oper IdetIP : IDet -> IP = notYet "IdetIP" ;
|
||||
oper IdetQuant : IQuant -> Num -> IDet = notYet "IdetQuant" ;
|
||||
oper ImpPl1 : VP -> Utt = notYet "ImpPl1" ;
|
||||
oper ImpVP : VP -> Imp = notYet "ImpVP" ;
|
||||
oper ImpersCl : VP -> Cl = notYet "ImpersCl" ;
|
||||
oper OrdDigits : Digits -> Ord = notYet "OrdDigits" ;
|
||||
oper OrdNumeral : Numeral -> Ord = notYet "OrdNumeral" ;
|
||||
oper PPartNP : NP -> V2 -> NP = notYet "PPartNP" ;
|
||||
oper PassV2 : V2 -> VP = notYet "PassV2" ;
|
||||
oper PositAdvAdj : A -> Adv = notYet "PositAdvAdj" ;
|
||||
oper PredSCVP : SC -> VP -> Cl = notYet "PredSCVP" ;
|
||||
oper PredetNP : Predet -> NP -> NP = notYet "PredetNP" ;
|
||||
oper PrepIP : Prep -> IP -> IAdv = notYet "PrepIP" ;
|
||||
oper ProgrVP : VP -> VP = notYet "ProgrVP" ;
|
||||
oper QuestIAdv : IAdv -> Cl -> QCl = notYet "QuestIAdv" ;
|
||||
oper QuestIComp : IComp -> NP -> QCl = notYet "QuestIComp" ;
|
||||
oper QuestSlash : IP -> ClSlash -> QCl = notYet "QuestSlash" ;
|
||||
oper QuestVP : IP -> VP -> QCl = notYet "QuestVP" ;
|
||||
oper ReflA2 : A2 -> AP = notYet "ReflA2" ;
|
||||
oper ReflVP : VPSlash -> VP = notYet "ReflVP" ;
|
||||
oper RelCl : Cl -> RCl = notYet "RelCl" ;
|
||||
oper RelNP : NP -> RS -> NP = notYet "RelNP" ;
|
||||
oper RelSlash : RP -> ClSlash -> RCl = notYet "RelSlash" ;
|
||||
oper SentAP : AP -> SC -> AP = notYet "SentAP" ;
|
||||
oper SentCN : CN -> SC -> CN = notYet "SentCN" ;
|
||||
oper Slash2V3 : V3 -> NP -> VPSlash = notYet "Slash2V3" ;
|
||||
oper Slash3V3 : V3 -> NP -> VPSlash = notYet "Slash3V3" ;
|
||||
oper SlashPrep : Cl -> Prep -> ClSlash = notYet "SlashPrep" ;
|
||||
oper SlashV2A : V2A -> AP -> VPSlash = notYet "SlashV2A" ;
|
||||
oper SlashV2Q : V2Q -> QS -> VPSlash = notYet "SlashV2Q" ;
|
||||
oper SlashV2S : V2S -> S -> VPSlash = notYet "SlashV2S" ;
|
||||
oper SlashV2V : V2V -> VP -> VPSlash = notYet "SlashV2V" ;
|
||||
oper SlashV2VNP : V2V -> NP -> VPSlash -> VPSlash = notYet "SlashV2VNP" ;
|
||||
oper SlashVP : NP -> VPSlash -> ClSlash = notYet "SlashVP" ;
|
||||
oper SlashVS : NP -> VS -> SSlash -> ClSlash = notYet "SlashVS" ;
|
||||
oper SlashVV : VV -> VPSlash -> VPSlash = notYet "SlashVV" ;
|
||||
oper SubjS : Subj -> S -> Adv = notYet "SubjS" ;
|
||||
oper TCond : Tense = notYet "TCond" ;
|
||||
oper TFut : Tense = notYet "TFut" ;
|
||||
oper Use2N3 : N3 -> N2 = notYet "Use2N3" ;
|
||||
oper UseN2 : N2 -> CN = notYet "UseN2" ;
|
||||
oper UseSlash : Temp -> Pol -> ClSlash -> SSlash = notYet "UseSlash" ;
|
||||
oper UttCard : Card -> Utt = notYet "UttCard" ;
|
||||
oper UttIAdv : IAdv -> Utt = notYet "UttIAdv" ;
|
||||
oper UttIP : IP -> Utt = notYet "UttIP" ;
|
||||
oper UttImpPl : Pol -> Imp -> Utt = notYet "UttImpPl" ;
|
||||
oper UttImpPol : Pol -> Imp -> Utt = notYet "UttImpPol" ;
|
||||
oper UttImpSg : Pol -> Imp -> Utt = notYet "UttImpSg" ;
|
||||
oper UttQS : QS -> Utt = notYet "UttQS" ;
|
||||
oper UttVP : VP -> Utt = notYet "UttVP" ;
|
||||
oper by8agent_Prep : Prep = notYet "by8agent_Prep" ;
|
||||
oper whatSg_IP : IP = notYet "whatSg_IP" ;
|
||||
oper which_IQuant : IQuant = notYet "which_IQuant" ;
|
||||
oper whoSg_IP : IP = notYet "whoSg_IP" ;
|
||||
oper youPol_Pron : Pron = notYet "youPol_Pron" ;
|
||||
|
||||
oper BaseSymb : Symb -> Symb -> [Symb] = notYet "BaseSymb" ;
|
||||
oper CNIntNP : CN -> PredefCnc.Int -> NP = notYet "CNIntNP" ;
|
||||
oper CNNumNP : CN -> Card -> NP = notYet "CNumNP" ;
|
||||
oper CNSymbNP : Det -> CN -> [Symb] -> NP = notYet "CNSymbNP" ;
|
||||
oper ConsSymb : Symb -> [Symb] -> [Symb] = notYet "ConsSymb" ;
|
||||
oper FloatPN : PredefCnc.Float -> PN = notYet "FloatPN" ;
|
||||
oper NumPN : Card -> PN = notYet "NumPN" ;
|
||||
oper SymbOrd : Symb -> Ord = notYet "SymbOrd" ;
|
||||
oper SymbS : Symb -> S = notYet "SymbS" ;
|
||||
|
||||
}
|
||||
101
src/croatian/NounHrv.gf
Normal file
101
src/croatian/NounHrv.gf
Normal file
@@ -0,0 +1,101 @@
|
||||
concrete NounHrv of Noun =
|
||||
CatHrv
|
||||
**
|
||||
|
||||
open ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
DetCN det cn = {
|
||||
s,prep,clit = \\c => det.s ! cn.g ! c ++ numSizeForm cn.s det.size c ;
|
||||
a = numSizeAgr cn.g det.size P3 ;
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
DetNP det = {
|
||||
s,prep,clit = \\c => det.s ! Neutr ! c ;
|
||||
a = numSizeAgr Neutr det.size P3 ;
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
MassNP cn = {
|
||||
s,prep,clit = \\c => cn.s ! Sg ! c ;
|
||||
a = Ag cn.g Sg P3 ;
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
DetQuant quant num = {
|
||||
s = \\g,c => num.s ! g ! c ++ quant.s ! g ! numSizeNumber num.size ! c ;
|
||||
size = num.size
|
||||
} ;
|
||||
|
||||
DefArt = {s = \\_,_,_ => []} ;
|
||||
IndefArt = {s = \\_,_,_ => []} ;
|
||||
NumPl = {s = \\_,_ => [] ; size = NS_2_4} ; ---- size
|
||||
NumSg = {s = \\_,_ => [] ; size = NS_1} ;
|
||||
|
||||
UsePron pron = {
|
||||
s, prep = table { ---- TODO check prep
|
||||
Nom | Voc => pron.nom ;
|
||||
Gen | Acc => pron.gen ;
|
||||
Dat | Loc => pron.dat ;
|
||||
Ins => pron.ins
|
||||
} ;
|
||||
clit = table { ---- TODO check prep
|
||||
Nom | Voc => pron.nom ;
|
||||
Gen | Acc => pron.cgen ;
|
||||
Dat | Loc => pron.cdat ;
|
||||
Ins => pron.ins
|
||||
} ;
|
||||
a = pron.a ;
|
||||
hasClit = True ;
|
||||
} ;
|
||||
|
||||
PossPron pron = adjFormsAdjective pron.poss ;
|
||||
|
||||
UsePN pn = {
|
||||
s,clit,prep = \\c => pn.s ! c ;
|
||||
a = Ag pn.g Sg P3 ;
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
AdjCN ap cn = {
|
||||
s = \\n,c => preOrPost (notB ap.isPost) (ap.s ! cn.g ! n ! c) (cn.s ! n ! c) ;
|
||||
g = cn.g
|
||||
} ;
|
||||
|
||||
RelCN cn rs = {
|
||||
s = \\n,c => cn.s ! n ! c ++ rs.s ! Ag cn.g n P3 ;
|
||||
g = cn.g
|
||||
} ;
|
||||
|
||||
AdvCN cn adv = {
|
||||
s = \\n,c => cn.s ! n ! c ++ adv.s ;
|
||||
g = cn.g
|
||||
} ;
|
||||
|
||||
AdvNP np adv = {
|
||||
s,clit = \\c => np.s ! c ++ adv.s ;
|
||||
prep = \\c => np.prep ! c ++ adv.s ;
|
||||
a = np.a ;
|
||||
hasClit = False ;
|
||||
} ;
|
||||
|
||||
UseN n = nounFormsNoun n n.g ;
|
||||
|
||||
ApposCN cn np = {
|
||||
s = \\n,c => cn.s ! n ! c ++ np.s ! c ; ---- TODO check apposition order
|
||||
g = cn.g
|
||||
} ;
|
||||
|
||||
NumCard c = c ;
|
||||
NumDigits ds = ds ** {s = \\_,_ => ds.s} ;
|
||||
NumNumeral nu = {
|
||||
s = \\g,c => (adjFormsAdjective nu.s).s ! g ! Sg ! c ; ---- TODO Sg?
|
||||
size = nu.size
|
||||
} ;
|
||||
|
||||
AdNum adn card = card ** {s = \\g,c => adn.s ++ card.s ! g ! c} ;
|
||||
OrdSuperl a = a.superl ;
|
||||
|
||||
|
||||
}
|
||||
139
src/croatian/NumeralHrv.gf
Normal file
139
src/croatian/NumeralHrv.gf
Normal file
@@ -0,0 +1,139 @@
|
||||
concrete NumeralHrv of Numeral =
|
||||
|
||||
CatHrv [Numeral, Digits] **
|
||||
|
||||
open
|
||||
ResHrv,
|
||||
Prelude
|
||||
in {
|
||||
|
||||
-- AR 2022-09-27
|
||||
---- TODO ordinal forms
|
||||
|
||||
oper LinNumeral = {s : AdjForms ; size : NumSize} ;
|
||||
oper LinDigit = {unit : AdjForms ; teen, ten, hundred : Str ; size : NumSize} ;
|
||||
|
||||
lincat Digit = LinDigit ;
|
||||
lincat Sub10 = LinDigit ;
|
||||
|
||||
lincat Sub100 = LinNumeral ;
|
||||
lincat Sub1000 = LinNumeral ;
|
||||
lincat Sub1000000 = LinNumeral ;
|
||||
|
||||
oper mkDigit : AdjForms -> Str -> Str -> Str -> NumSize -> LinDigit =
|
||||
\dva, dvanaest, dvadeset, dvjesto, size -> {
|
||||
unit = dva ;
|
||||
teen = dvanaest ;
|
||||
ten = dvadeset ;
|
||||
hundred = dvjesto ;
|
||||
size = size
|
||||
} ;
|
||||
|
||||
oper mkBigDigit : (unit, teen, ten, hundred : Str) -> LinDigit =
|
||||
\unit,ten,teen,hundred -> mkDigit (invarAdjForms unit) ten teen hundred NS_5_20 ;
|
||||
|
||||
oper bigNumeral : Str -> LinNumeral = \s -> {
|
||||
s = invarAdjForms s ;
|
||||
size = NS_20_
|
||||
} ;
|
||||
|
||||
lin num x = x ;
|
||||
|
||||
lin n2 =
|
||||
let
|
||||
dva = invarAdjForms "dva" ** { --- BCMS: cases rarely used
|
||||
fsnom, fsacc = "dvije" ;
|
||||
msgen = "dvaju" ;
|
||||
fsgen = "dviju" ;
|
||||
msdat = "dvama" ;
|
||||
fsdat = "dvjema"
|
||||
}
|
||||
in mkDigit dva "dvanaest" "dvadeset" "dvjesto" NS_2_4 ;
|
||||
|
||||
lin n3 =
|
||||
let
|
||||
tri = invarAdjForms "tri" ** { --- BCMS: cases rarely used
|
||||
msgen, fsgen = "triju" ;
|
||||
msdat, fsdat, msloc, mksins = "trima"
|
||||
}
|
||||
in
|
||||
mkDigit tri "trinaest" "trideset" "tristo" NS_2_4 ;
|
||||
|
||||
lin n4 =
|
||||
let
|
||||
cetiri = invarAdjForms "četiri" ** { --- BCMS: cases rarely used
|
||||
msgen, fsgen = "četiriju" ;
|
||||
msdat, fsdat, msloc, mksins = "četirima"
|
||||
}
|
||||
in
|
||||
mkDigit cetiri "četrnaest" "četrdeset" "četiristo" NS_2_4 ;
|
||||
|
||||
lin n5 = mkBigDigit "pet" "petnaest" "pedeset" "petsto" ;
|
||||
lin n6 = mkBigDigit "šest" "šesnaest" "šezdeset" "šeststo" ;
|
||||
lin n7 = mkBigDigit "sedam" "sedamnaest" "sedamdeset" "sedamsto" ;
|
||||
lin n8 = mkBigDigit "osam" "osamnaest" "osamdeset" "osamsto" ;
|
||||
lin n9 = mkBigDigit "devet" "devetnaest" "devedeset" "devetsto" ;
|
||||
|
||||
lin pot01 = mkDigit (velikA "jedan") "jedanaest" "deset" "sto" NS_1 ;
|
||||
lin pot0 d = d ;
|
||||
|
||||
|
||||
lin pot110 = bigNumeral "deset" ;
|
||||
lin pot111 = bigNumeral "jedanaest" ;
|
||||
lin pot1to19 d = bigNumeral d.teen ;
|
||||
|
||||
lin pot0as1 n = {s = n.unit ; size = n.size} ;
|
||||
lin pot1 d = bigNumeral d.ten ;
|
||||
lin pot1plus d e = {
|
||||
s = invarAdjForms (d.ten ++ e.unit.msnom) ; ---- TODO inflection of e
|
||||
size = e.size
|
||||
} ;
|
||||
|
||||
lin pot1as2 n = n ;
|
||||
lin pot2 d = bigNumeral d.hundred ;
|
||||
lin pot2plus d e = {
|
||||
s = invarAdjForms (d.hundred ++ e.s.msnom) ; ---- TODO inflection of e
|
||||
size = e.size
|
||||
} ;
|
||||
|
||||
lin pot2as3 n = n ;
|
||||
|
||||
|
||||
lin pot3 n = bigNumeral (mkThousand n.s.fsnom n.size) ;
|
||||
|
||||
lin pot3plus n m = {
|
||||
s = invarAdjForms (mkThousand n.s.fsnom n.size ++ m.s.msnom) ; ---- TODO inflect m
|
||||
size = m.size
|
||||
} ;
|
||||
|
||||
----oper tfSize : NumSize -> NumSize = \sz ->
|
||||
---- table {Num1 => Num5 ; other => other} ! sz ;
|
||||
|
||||
oper mkThousand : Str -> NumSize -> Str = \attr,size ->
|
||||
case size of {
|
||||
NS_1 => "tisuću" ; -- BMS: hiljadu etc
|
||||
NS_2_4 => attr ++ "tisuće" ;
|
||||
_ => attr ++ "tisuća"
|
||||
} ;
|
||||
|
||||
|
||||
-- -- Numerals as sequences of digits have a separate, simpler grammar
|
||||
lincat Dig = {s : Str ; size : NumSize} ;
|
||||
|
||||
lin
|
||||
IDig d = d ;
|
||||
|
||||
IIDig d dd = {s = d.s ++ Predef.BIND ++ dd.s ; size = dd.size} ;
|
||||
|
||||
D_0 = { s = "0" ; size = NS_1} ; ---- ??
|
||||
D_1 = { s = "1" ; size = NS_1} ;
|
||||
D_2 = { s = "2" ; size = NS_2_4} ;
|
||||
D_3 = { s = "3" ; size = NS_2_4} ;
|
||||
D_4 = { s = "4" ; size = NS_2_4} ;
|
||||
D_5 = { s = "5" ; size = NS_5_20} ;
|
||||
D_6 = { s = "6" ; size = NS_5_20} ;
|
||||
D_7 = { s = "7" ; size = NS_5_20} ;
|
||||
D_8 = { s = "8" ; size = NS_5_20} ;
|
||||
D_9 = { s = "9" ; size = NS_5_20} ;
|
||||
|
||||
}
|
||||
246
src/croatian/ParadigmsHrv.gf
Normal file
246
src/croatian/ParadigmsHrv.gf
Normal file
@@ -0,0 +1,246 @@
|
||||
resource ParadigmsHrv = open CatHrv, ResHrv, (R=ResHrv), Prelude in {
|
||||
|
||||
----------------
|
||||
-- Parameters
|
||||
|
||||
oper
|
||||
singular : Number
|
||||
= Sg ;
|
||||
plural : Number
|
||||
= Pl ;
|
||||
|
||||
mascAnimate : Gender
|
||||
= Masc Anim ;
|
||||
mascInanimate : Gender
|
||||
= Masc Inanim ;
|
||||
masculine : Gender
|
||||
= Masc Inanim ;
|
||||
feminine : Gender
|
||||
= Fem ;
|
||||
neuter : Gender
|
||||
= Neutr ;
|
||||
|
||||
nominative : Case
|
||||
= Nom ;
|
||||
genitive : Case
|
||||
= Gen ;
|
||||
dative : Case
|
||||
= Dat ;
|
||||
accusative : Case
|
||||
= Acc ;
|
||||
vocative : Case
|
||||
= R.Voc ;
|
||||
locative : Case
|
||||
= Loc ;
|
||||
instrumental : Case
|
||||
= Ins ;
|
||||
|
||||
------------------------------
|
||||
-- Nouns
|
||||
|
||||
oper
|
||||
|
||||
mkN = overload {
|
||||
mkN : (sgnom : Str) -> N -- guessing gender
|
||||
= \sgnom -> lin N (smartLexNoun sgnom) ;
|
||||
mkN : (sgnom : Str) -> Gender -> N
|
||||
= \sgnom, g -> lin N (mkgLexNoun sgnom g) ;
|
||||
mkN : NForms -> Gender -> N -- the worst case
|
||||
= \nfs,g -> lin N (nfs ** {g = g}) ;
|
||||
} ;
|
||||
|
||||
-- The following standard declensions can be used with good accuracy.
|
||||
-- However, they have some defaults that may have to be overwritten.
|
||||
-- This can be done easily by overriding those formes with record extension (**).
|
||||
|
||||
NForms = {snom,sgen,sdat,sacc,svoc,sins,pnom,pgen,pdat,pacc : Str} ;
|
||||
|
||||
izvorNForms : Str -> NForms
|
||||
= izvorN ;
|
||||
nokatNForms : Str -> NForms
|
||||
= nokatN ;
|
||||
gradaninNForms : Str -> NForms
|
||||
= gradaninN ;
|
||||
vojnikNForms : Str -> NForms
|
||||
= vojnikN ;
|
||||
bubregNForms : Str -> NForms
|
||||
= bubregN ;
|
||||
trbuhNForms : Str -> NForms
|
||||
= trbuhN ;
|
||||
cvorakNForms : Str -> NForms
|
||||
= cvorakN ;
|
||||
panjNForms : Str -> NForms
|
||||
= panjN ;
|
||||
suzanjNForms : Str -> NForms
|
||||
= suzanjN ;
|
||||
pristNForms : Str -> NForms
|
||||
= pristN ;
|
||||
stricNForms : Str -> NForms
|
||||
= stricN ;
|
||||
klinacNForms : Str -> NForms
|
||||
= klinacN ;
|
||||
posjetilacNForms : Str -> NForms
|
||||
= posjetilacN ;
|
||||
pepeoNForms : Str -> NForms
|
||||
= pepeoN ;
|
||||
ugaoNForms : Str -> NForms
|
||||
= ugaoN ;
|
||||
bifeNForms : Str -> NForms
|
||||
= bifeN ;
|
||||
ziriNForms : Str -> NForms
|
||||
= ziriN ;
|
||||
taksiNForms : Str -> NForms
|
||||
= taksiN ;
|
||||
koljenoNForms : Str -> NForms
|
||||
= koljenoN ;
|
||||
jedroNForms : Str -> NForms
|
||||
= jedroN ;
|
||||
poljeNForms : Str -> NForms
|
||||
= poljeN ;
|
||||
zenaNForms : Str -> NForms
|
||||
= zenaN ;
|
||||
|
||||
PNForms : Type = {snom, sgen, sdat, sacc, svoc, sins : Str} ;
|
||||
|
||||
mkPN = overload {
|
||||
mkPN : Str -> PN
|
||||
= \s ->
|
||||
let
|
||||
nf = smartLexNoun s ;
|
||||
n = nounFormsNoun nf nf.g
|
||||
in lin PN {
|
||||
s = \\c => n.s ! Sg ! c ; ---- TODO check this
|
||||
g = nf.g
|
||||
} ;
|
||||
mkPN : PNForms -> Gender -> PN
|
||||
= \fs, g -> lin PN {
|
||||
s = table {
|
||||
Nom => fs.snom ;
|
||||
Gen => fs.sgen ;
|
||||
Dat | Loc => fs.sdat ;
|
||||
Acc => fs.sacc ;
|
||||
Voc => fs.svoc ;
|
||||
Ins => fs.sins
|
||||
} ;
|
||||
g = g
|
||||
} ;
|
||||
} ;
|
||||
|
||||
---------------------
|
||||
-- Adjectives
|
||||
|
||||
-- Only positive forms so far ----
|
||||
|
||||
mkA = overload {
|
||||
mkA : Str -> A
|
||||
= \s ->
|
||||
let
|
||||
velik = velikA s ;
|
||||
velikiji = regComparAForms velik ;
|
||||
in lin A {
|
||||
posit = velik ;
|
||||
compar = velikiji ;
|
||||
superl = superlAForms velikiji
|
||||
} ;
|
||||
mkA : (pos, comp : Str) -> A
|
||||
= \pos, comp -> lin A {
|
||||
posit = velikA pos ;
|
||||
compar = velikA comp ;
|
||||
superl = superlAForms (velikA comp)
|
||||
} ;
|
||||
mkA : (posit : AForms) -> (compar : Str) -> A
|
||||
= \posit,compar -> lin A {
|
||||
posit = posit ;
|
||||
compar = velikA compar ;
|
||||
superl = superlAForms (velikA compar)
|
||||
} ;
|
||||
mkA : (posit, compar : AForms) -> A
|
||||
= \posit,compar -> lin A {
|
||||
posit = posit ;
|
||||
compar = compar ;
|
||||
superl = superlAForms compar
|
||||
} ;
|
||||
mkA : (posit : AForms) -> A
|
||||
= \posit ->
|
||||
let
|
||||
compar = regComparAForms posit
|
||||
in lin A {
|
||||
posit = posit ;
|
||||
compar = compar ;
|
||||
superl = superlAForms compar
|
||||
} ;
|
||||
} ;
|
||||
|
||||
invarA : Str -> A
|
||||
= \s -> lin A {posit,compar,superl = invarAForms s} ; ---- TODO compar, superl?
|
||||
|
||||
AForms : Type
|
||||
= R.AdjForms ;
|
||||
|
||||
-- the complete definition of AForms is
|
||||
-- {msnom, fsnom, nsnom, msgen, fsgen, msdat,
|
||||
-- fsdat, fsacc, msloc, msins, fsins, mpnom, pgen : Str} ;
|
||||
|
||||
velikAForms : Str -> AForms
|
||||
= velikA ;
|
||||
|
||||
invarAForms : Str -> AForms
|
||||
= \s -> invarAdjForms s ;
|
||||
|
||||
|
||||
-------------------------
|
||||
-- Verbs
|
||||
|
||||
mkV = overload {
|
||||
mkV : (raditi : Str) -> V
|
||||
= \s -> lin V {s = smartVerbForms s} ;
|
||||
mkV : (raditi, radem, radio : Str) -> V
|
||||
= \raditi, radem, radio ->
|
||||
lin V {s = aeiVerbForms raditi radem radio} ;
|
||||
mkV : VerbForms -> V
|
||||
= \vf -> lin V {s = vf} ;
|
||||
} ;
|
||||
|
||||
|
||||
mkV2 = overload {
|
||||
mkV2 : V -> V2
|
||||
= \v -> lin V2 {s = v.s ;
|
||||
c = {s = [] ; c = accusative ; hasPrep = False}} ;
|
||||
mkV2 : V -> Case -> V2
|
||||
= \v,c -> lin V2 {s = v.s ;
|
||||
c = {s = [] ; c = c ; hasPrep = False}} ;
|
||||
mkV2 : V -> Prep -> V2
|
||||
= \v,c -> lin V2 {s = v.s ; c = c} ;
|
||||
} ;
|
||||
|
||||
------------------------
|
||||
-- Adverbs, prepositions, conjunctions, ...
|
||||
|
||||
mkAdv : Str -> Adv
|
||||
= \s -> lin Adv {s = s} ;
|
||||
|
||||
mkPrep = overload {
|
||||
mkPrep : Str -> Prep -- genitive prepositions
|
||||
= \s -> lin Prep {s = s ; c = genitive ; hasPrep = True} ;
|
||||
mkPrep : Case -> Prep -- oblique cases, empty string
|
||||
= \c -> lin Prep {s = [] ; c = c ; hasPrep = False} ;
|
||||
mkPrep : Str -> Case -> Prep
|
||||
= \s,c -> lin Prep {s = s ; c = c ; hasPrep = True} ;
|
||||
} ;
|
||||
|
||||
mkConj : Str -> Conj
|
||||
= \s -> lin Conj {s1 = [] ; s2 = s} ;
|
||||
|
||||
mkAdN : Str -> AdN
|
||||
= \s -> lin AdN {s = s} ;
|
||||
|
||||
mkOrd : Str -> Ord
|
||||
= \s -> lin Ord (velikA s) ;
|
||||
|
||||
ifPluralNP : NP -> Bool
|
||||
= \np -> case np.a of {
|
||||
Ag _ Pl _ => True ;
|
||||
_ => False
|
||||
} ;
|
||||
|
||||
}
|
||||
19
src/croatian/PhraseHrv.gf
Normal file
19
src/croatian/PhraseHrv.gf
Normal file
@@ -0,0 +1,19 @@
|
||||
concrete PhraseHrv of Phrase = CatHrv ** open Prelude, ResHrv in {
|
||||
|
||||
lin
|
||||
UttS s = s ;
|
||||
UttAdv adv = adv ;
|
||||
UttCN cn = {s = cn.s ! Sg ! Nom} ;
|
||||
UttAP ap = {s = ap.s ! Masc Anim ! Sg ! Nom} ;
|
||||
UttNP np = {s = np.s ! Nom} ;
|
||||
|
||||
PhrUtt pconj utt voc = {s = pconj.s ++ utt.s ++ voc.s} ;
|
||||
|
||||
|
||||
NoPConj = {s = []} ;
|
||||
PConjConj conj = {s = conj.s2} ;
|
||||
|
||||
NoVoc = {s = []} ;
|
||||
VocNP np = {s = np.s ! Nom} ;
|
||||
|
||||
}
|
||||
7
src/croatian/QuestionHrv.gf
Normal file
7
src/croatian/QuestionHrv.gf
Normal file
@@ -0,0 +1,7 @@
|
||||
concrete QuestionHrv of Question = CatHrv **
|
||||
open ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
QuestCl cl = cl ; ----
|
||||
|
||||
}
|
||||
18
src/croatian/RelativeHrv.gf
Normal file
18
src/croatian/RelativeHrv.gf
Normal file
@@ -0,0 +1,18 @@
|
||||
concrete RelativeHrv of Relative = CatHrv ** open
|
||||
ParadigmsHrv,
|
||||
ResHrv,
|
||||
Prelude in {
|
||||
|
||||
lin
|
||||
RelVP rp vp = vp ** {
|
||||
subj =
|
||||
let rel = (adjFormsAdjective rp).s
|
||||
in \\a => case a of {
|
||||
Ag g n _ => rel ! g ! n ! Nom
|
||||
}
|
||||
} ;
|
||||
|
||||
IdRP = (mkA "koji").posit ;
|
||||
|
||||
|
||||
}
|
||||
659
src/croatian/ResHrv.gf
Normal file
659
src/croatian/ResHrv.gf
Normal file
@@ -0,0 +1,659 @@
|
||||
resource ResHrv = open Prelude in {
|
||||
|
||||
-- AR September 2022
|
||||
-- sources:
|
||||
-- Wiki = https://en.wikipedia.org/wiki/Serbo-Croatian_grammar
|
||||
-- BCMS = Bosnian, Croatian, Montenegrin and Serbian:
|
||||
-- An Essential Grammar (Routledge Essential Grammars) 1st Edition, by Željko Vrabec
|
||||
|
||||
-- parameters
|
||||
|
||||
param
|
||||
Number = Sg | Pl ;
|
||||
|
||||
Animacy = Anim | Inanim ;
|
||||
Gender = Masc Animacy | Fem | Neutr ;
|
||||
|
||||
Case = Nom | Gen | Dat | Acc | Voc | Loc | Ins ; -- traditional order
|
||||
|
||||
Person = P1 | P2 | P3 ;
|
||||
|
||||
VForm =
|
||||
VInf
|
||||
| VPres Number Person
|
||||
| VPastPart Gender Number
|
||||
;
|
||||
---- TODO aorist, imperfect
|
||||
|
||||
Agr = Ag Gender Number Person ;
|
||||
|
||||
CTense = CTPres | CTPast ; ----- TODO complete the tense system to match BCS verb morphology
|
||||
|
||||
-- phonology
|
||||
|
||||
oper
|
||||
softConsonant : pattern Str = #("c"|"č"|"ć"|"đ"|"j"|"lj"|"nj"|"š"|"ž"|"št") ;
|
||||
--- wiki "and sometimes r"; BCMS slightly different
|
||||
|
||||
ifSoft : Str -> (soft,hard : Str) -> Str = \word, ssoft, shard ->
|
||||
case word of {
|
||||
_ + #softConsonant => ssoft ;
|
||||
_ => shard
|
||||
} ;
|
||||
|
||||
animate = Masc Anim ;
|
||||
inanimate = Masc Inanim ;
|
||||
feminine = Fem ;
|
||||
neuter = Neutr ;
|
||||
|
||||
palatalize : Str -> Str = \s -> case s of {
|
||||
x + "ki" => x + "ci" ;
|
||||
x + "ke" => x + "če" ;
|
||||
x + "gi" => x + "zi" ;
|
||||
x + "ge" => x + "že" ;
|
||||
x + "hi" => x + "si" ;
|
||||
x + "he" => x + "še" ;
|
||||
x + "ce" => x + "če" ;
|
||||
_ => s
|
||||
} ;
|
||||
|
||||
voicing : Str -> Str = \s -> case s of {
|
||||
x + "b" => x + "p" ;
|
||||
x + "d" => x + "t" ;
|
||||
x + "đ" => x + "ć" ;
|
||||
x + "z" => x + "s" ;
|
||||
x + "dž" => x + "č" ;
|
||||
x + "ž" => x + "š" ;
|
||||
_ => s
|
||||
} ;
|
||||
|
||||
---------------
|
||||
-- Nouns
|
||||
---------------
|
||||
|
||||
-- novel idea (for RGL): lexical items stored as records rather than tables
|
||||
-- advantages:
|
||||
-- - easier to make exceptions to paradigms (by ** {})
|
||||
-- - easier to keep the number of forms minimal
|
||||
-- - easier to see what is happening than with lots of anonymous arguments to mkN, mkA, mkV
|
||||
|
||||
-- so this is the lincat of N
|
||||
|
||||
NounForms : Type = {snom,sgen,sdat,sacc,svoc,sins,pnom,pgen,pdat,pacc : Str} ;
|
||||
|
||||
-- But traditional tables make agreement easier to handle in syntax
|
||||
-- so this is the lincat of CN
|
||||
|
||||
Noun : Type = {s : Number => Case => Str ; g : Gender} ;
|
||||
|
||||
-- for lexical nouns N, we also need the gender but keep the minimal set of forms
|
||||
|
||||
LexNoun : Type = NounForms ** {g : Gender} ;
|
||||
|
||||
-- this is used in UseN
|
||||
|
||||
nounFormsNoun : NounForms -> Gender -> Noun
|
||||
= \forms, g -> {
|
||||
s = table {
|
||||
Sg => table {
|
||||
Nom => forms.snom ;
|
||||
Gen => forms.sgen ;
|
||||
Dat => forms.sdat ;
|
||||
Acc => case g of {
|
||||
Masc Anim | Fem => forms.sacc ;
|
||||
_ => forms.snom
|
||||
} ;
|
||||
Voc => forms.svoc ;
|
||||
Loc => forms.sdat ;
|
||||
Ins => forms.sins
|
||||
} ;
|
||||
Pl => table {
|
||||
Nom => forms.pnom ;
|
||||
Gen => forms.pgen ;
|
||||
Dat => forms.pdat ;
|
||||
Acc => forms.pacc ;
|
||||
Voc => forms.pnom ;
|
||||
Loc => forms.pdat ;
|
||||
Ins => forms.pdat
|
||||
}
|
||||
} ;
|
||||
g = g
|
||||
} ;
|
||||
|
||||
-- a declension type produces these forms from a string
|
||||
|
||||
DeclensionType : Type = Str -> NounForms ;
|
||||
|
||||
-- smart paradigms
|
||||
|
||||
smartLexNoun : Str -> LexNoun = \s -> case s of {
|
||||
_ + "a" => zenaN s ** {g = feminine} ;
|
||||
_ + "i" => ziriN s ** {g = inanimate} ; ---- TODO feminine i
|
||||
_ + "e" => poljeN s ** {g = neuter} ; ---- TODO sunce, uze, zvonce, rame
|
||||
_ + "ao" => ugaoN s ** {g = inanimate} ;
|
||||
_ + "eo" => pepeoN s ** {g = inanimate} ;
|
||||
_ + "o" => koljenoN s ** {g = neuter} ; ---- TODO jedro
|
||||
_ + "lac" => posjetilacN s ** {g = inanimate} ;
|
||||
_ + "anj" => suzanjN s ** {g = inanimate} ;
|
||||
_ + "nj" => panjN s ** {g = inanimate} ;
|
||||
_ + "št" => pristN s ** {g = inanimate} ;
|
||||
_ + "ac" => klinacN s ** {g = neuter} ;
|
||||
_ + "c" => stricN s ** {g = inanimate} ;
|
||||
_ + "in" => gradaninN s ** {g = neuter} ;
|
||||
_ + "ak" => cvorakN s ** {g = inanimate} ;
|
||||
_ + "a" + ? => nokatN s ** {g = inanimate} ;
|
||||
_ + "g" => bubregN s ** {g = inanimate} ;
|
||||
_ + "h" => trbuhN s ** {g = inanimate} ;
|
||||
_ + "k" => vojnikN s ** {g = inanimate} ;
|
||||
_ => izvorN s ** {g = inanimate}
|
||||
} ;
|
||||
|
||||
mkgLexNoun : Str -> Gender -> LexNoun = \s,g -> case <s,g> of {
|
||||
<_ + "i", Masc _> => ziriN s ** {g = g} ;
|
||||
<_ + "e", Masc _> => bifeN s ** {g = g} ;
|
||||
<_ + "o", Masc _> => bifeN s ** {g = g} ;
|
||||
<_, g> => smartLexNoun s ** {g = g}
|
||||
} ;
|
||||
|
||||
|
||||
-- the traditional declensions, following Wiki
|
||||
-- they are also exported in ParadigmsHrv with names izvorN etc
|
||||
|
||||
izvorN : DeclensionType = \izvor ->
|
||||
{
|
||||
snom = izvor ;
|
||||
sgen = izvor + "a" ;
|
||||
sdat = izvor + "u" ;
|
||||
sacc = izvor + "a" ;
|
||||
svoc = ifSoft izvor
|
||||
(izvor + "u")
|
||||
(palatalize (izvor + "e")) ;
|
||||
sins = ifSoft izvor
|
||||
(izvor + "em")
|
||||
(izvor + "om") ;
|
||||
|
||||
pnom = palatalize (izvor + "i") ;
|
||||
pgen = izvor + "a" ;
|
||||
pdat =
|
||||
ifSoft izvor
|
||||
(palatalize (izvor + "e") + "vima")
|
||||
(palatalize (izvor + "i") + "ma") ;
|
||||
pacc = izvor + "e" ;
|
||||
} ;
|
||||
|
||||
nokatN : DeclensionType = \nokat ->
|
||||
let
|
||||
nokt = Predef.tk 2 nokat + last nokat
|
||||
in izvorN nokt ** {
|
||||
snom = nokat ;
|
||||
sacc = nokt + "a" ;
|
||||
pgen = nokat + "a" ;
|
||||
} ;
|
||||
|
||||
gradaninN : DeclensionType = \gradanin ->
|
||||
let
|
||||
gradan = Predef.tk 2 gradanin ;
|
||||
gradanN = izvorN gradan
|
||||
in numbersNounForms (izvorN gradanin) gradanN ;
|
||||
|
||||
numbersNounForms : (sg, pl : NounForms) -> NounForms =
|
||||
\sg, pl -> sg ** {
|
||||
pnom = pl.pnom ;
|
||||
pgen = pl.pgen ;
|
||||
pdat = pl.pdat ;
|
||||
pacc = pl.pacc ;
|
||||
} ;
|
||||
|
||||
vojnikN : DeclensionType = izvorN ;
|
||||
bubregN : DeclensionType = izvorN ;
|
||||
trbuhN : DeclensionType = izvorN ;
|
||||
cvorakN : DeclensionType = nokatN ;
|
||||
|
||||
panjN : DeclensionType = \panj ->
|
||||
numbersNounForms (izvorN panj) (izvorN (palatalize (panj + "e") + "v")) ;
|
||||
|
||||
suzanjN : DeclensionType = \suzanj ->
|
||||
let
|
||||
suznj = Predef.tk 3 suzanj + Predef.dp 2 suzanj
|
||||
in
|
||||
numbersNounForms
|
||||
(izvorN suzanj)
|
||||
(izvorN suznj ** {
|
||||
pgen = "sužanja" ;
|
||||
pdat = "sužnjima"
|
||||
}) ;
|
||||
|
||||
pristN : DeclensionType = panjN ;
|
||||
|
||||
stricN : DeclensionType = \stric ->
|
||||
panjN stric ** {
|
||||
svoc = palatalize (stric + "e")
|
||||
} ;
|
||||
|
||||
klinacN : DeclensionType = \klinac ->
|
||||
let
|
||||
klinc = Predef.tk 2 klinac + last klinac
|
||||
in nokatN klinac ** {
|
||||
svoc = palatalize (klinc + "e") ;
|
||||
pdat = klinc + "ima" ;
|
||||
} ;
|
||||
|
||||
posjetilacN : DeclensionType = \posjetilac ->
|
||||
let
|
||||
posjetioc = Predef.tk 3 posjetilac + "oc"
|
||||
in izvorN posjetioc ** {
|
||||
snom = posjetilac ;
|
||||
svoc = palatalize (posjetioc + "e") ;
|
||||
sins = palatalize (posjetioc + "e") + "m" ;
|
||||
pgen = posjetilac + "a" ;
|
||||
pdat = palatalize (posjetioc + "i") + "ma" ;
|
||||
} ;
|
||||
|
||||
pepeoN : DeclensionType = \pepeo ->
|
||||
let
|
||||
pepel = init pepeo + "l"
|
||||
in izvorN pepel ** {snom = pepeo} ;
|
||||
|
||||
ugaoN : DeclensionType = \ugao ->
|
||||
let
|
||||
ugal = init ugao + "l" ;
|
||||
ugl = Predef.tk 2 ugal + last ugal
|
||||
in numbersNounForms
|
||||
(nokatN ugal ** {snom = ugao})
|
||||
(izvorN (ugl + "ov")) ;
|
||||
|
||||
bifeN : DeclensionType = \bife ->
|
||||
izvorN bife ** {svoc = bife + "u"} ;
|
||||
|
||||
ziriN : DeclensionType = \ziri ->
|
||||
bifeN (ziri + "j") ** {
|
||||
snom = ziri ;
|
||||
pdat = ziri + "jima" ;
|
||||
} ;
|
||||
|
||||
taksiN : DeclensionType = ziriN ;
|
||||
|
||||
---- Danilo, Hrvoje, raščupànko skipped
|
||||
|
||||
koljenoN : DeclensionType = \koljeno ->
|
||||
let
|
||||
koljen = init koljeno
|
||||
in izvorN koljen ** {
|
||||
snom, sacc, svoc = koljeno ;
|
||||
pnom, pacc, pvoc = koljen + "a" ;
|
||||
} ;
|
||||
|
||||
jedroN : DeclensionType = \jedro ->
|
||||
let
|
||||
jed = Predef.tk 2 jedro ;
|
||||
r = last (init jedro) ;
|
||||
in koljenoN jedro ** {
|
||||
pgen = jed + "a" + r + "a" ;
|
||||
} ;
|
||||
|
||||
---- drvo - drveta skipped, can also decline as koljeno
|
||||
---- oči, čudo skipped
|
||||
|
||||
poljeN : DeclensionType = \polje ->
|
||||
koljenoN polje ** {
|
||||
pdat = init polje + "ima" ;
|
||||
} ;
|
||||
|
||||
---- sunce, uže, zvonce, rame, podne, doba
|
||||
|
||||
---- no tables given in the sources for feminine nouns, so guessing from ending tables
|
||||
|
||||
zenaN : DeclensionType = \zena ->
|
||||
let
|
||||
zen = init zena
|
||||
in {
|
||||
snom = zena ;
|
||||
sgen = zen + "e" ;
|
||||
sdat = zen + "i" ;
|
||||
sacc = zen + "u" ;
|
||||
svoc = zen + "o" ; ---- o/a in Wiki ; o in https://sh.wiktionary.org/wiki/%C5%BEena
|
||||
sins = zen + "om" ;
|
||||
pnom, pacc, pvoc = zen + "e" ;
|
||||
pdat = zen + "ama" ;
|
||||
pgen = zen + "a" ;
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
---------------------------
|
||||
-- Adjectives
|
||||
|
||||
-- to be used for AP: 56 forms for each degree
|
||||
Adjective : Type = {s : Gender => Number => Case => Str} ;
|
||||
|
||||
-- to be used for A, in three degrees: 12 forms in each
|
||||
---- TODO other degrees than positive
|
||||
|
||||
AdjForms : Type = {
|
||||
msnom, fsnom, nsnom : Str ;
|
||||
msgen, fsgen : Str ; -- nsgen = msgen
|
||||
msdat : Str ; -- msloc,nsdat,nsloc = msdat
|
||||
fsdat : Str ; -- fsloc = fsdat
|
||||
fsacc : Str ; --
|
||||
msins : Str ; -- nsins, pdat, ploc, pins = msins
|
||||
fsins : Str ; -- no o/e variation like in msdat
|
||||
mpnom : Str ; -- mpvoc = mpnom
|
||||
mpgen : Str ; --
|
||||
} ;
|
||||
|
||||
invarAdjForms : Str -> AdjForms = \s -> {
|
||||
msnom, fsnom, nsnom, msgen, fsgen, msdat,
|
||||
fsdat, fsacc, msins, fsins, mpnom, mpgen = s ;
|
||||
} ;
|
||||
|
||||
-- used in PositA but will also work in Compar and Superl by calling their record fields
|
||||
|
||||
adjFormsAdjective : AdjForms -> Adjective = \afs -> {
|
||||
s = \\g,n,c => case <n,c,g> of {
|
||||
|
||||
<Sg, Nom|Voc, Masc _>
|
||||
| <Sg, Acc, Masc Inanim> => afs.msnom ;
|
||||
<Sg, Nom|Voc, Fem>
|
||||
| <Pl, Nom|Acc|Voc, Neutr> => afs.fsnom ;
|
||||
<Sg, Nom|Acc|Voc, Neutr> => afs.nsnom ;
|
||||
<Sg, Gen, Masc _ | Neutr>
|
||||
| <Sg, Acc, Masc Anim> => afs.msgen ;
|
||||
<Sg, Gen, Fem>
|
||||
| <Pl, Nom|Acc|Voc, Fem>
|
||||
| <Pl, Acc, Masc _> => afs.fsgen ;
|
||||
<Sg, Dat|Loc, Masc _|Neutr> => afs.msdat ;
|
||||
<Sg, Dat|Loc, Fem> => afs.fsdat ;
|
||||
<Sg, Acc, Fem> => afs.fsacc ;
|
||||
<Sg, Ins, Masc _|Neutr>
|
||||
| <Pl,Dat|Loc|Ins, _> => afs.msins ;
|
||||
<Sg, Ins, Fem> => afs.fsins ;
|
||||
<Pl, Nom|Voc, Masc _> => afs.mpnom ;
|
||||
<Pl, Gen,_> => afs.mpgen
|
||||
}
|
||||
} ;
|
||||
|
||||
velikA : Str -> AdjForms = \velik ->
|
||||
let
|
||||
velk : Str = case velik of {
|
||||
vel + "stan" => vel + "sn" ;
|
||||
vel + "ao" => vel + "l" ;
|
||||
vel + "ak" => voicing vel + "k" ;
|
||||
vel + "a" + k@? => vel + k ;
|
||||
vel + "i" => vel ;
|
||||
_ => velik
|
||||
} ;
|
||||
oe : Str = ifSoft velik "e" "o"
|
||||
in {
|
||||
msnom = velik ;
|
||||
fsnom = velk + "a" ;
|
||||
nsnom = velk + oe ;
|
||||
msgen = velk + oe + "g" ;
|
||||
fsgen = velk + "e" ;
|
||||
msdat = velk + oe + "m" ;
|
||||
fsdat = velk + "oj" ;
|
||||
fsacc = velk + "u" ;
|
||||
msins = velk + "im" ;
|
||||
fsins = velk + "om" ;
|
||||
mpnom = velk + "i" ;
|
||||
mpgen = velk + "ih" ;
|
||||
} ;
|
||||
|
||||
regComparAForms : AdjForms -> AdjForms
|
||||
= \aposit -> case init aposit.fsnom of {
|
||||
grub@(_ + "b"|"p"|"v"|"h") => velikA (grub + "lji") ;
|
||||
star => velikA (star + "iji")
|
||||
} ;
|
||||
|
||||
superlAForms : AdjForms -> AdjForms
|
||||
= \acompar -> velikA ("naj" + acompar.msnom) ;
|
||||
|
||||
od_Str = "od" ;
|
||||
|
||||
---------------------
|
||||
-- Verbs
|
||||
-- Wiki
|
||||
|
||||
VerbForms : Type = VForm => Str ;
|
||||
|
||||
ComplementCase : Type = {s : Str ; c : Case ; hasPrep : Bool} ;
|
||||
|
||||
verbAgr : VerbForms -> Agr -> CTense -> Str ---- TODO tenses
|
||||
= \vf,a,b -> case <a,b> of {
|
||||
<Ag _ n p, CTPres> => vf ! VPres n p ;
|
||||
<Ag g n _, CTPast> => vf ! VPastPart g n
|
||||
} ;
|
||||
|
||||
smartVerbForms : Str -> VerbForms = \s -> case s of {
|
||||
cit + "ati" => aeiVerbForms s (cit + "am") (cit + "ao") ;
|
||||
vid + "jeti" => aeiVerbForms s (vid + "im") (vid + "io") ;
|
||||
radi + "ti" => aeiVerbForms s (init radi + "em") (radi + "o") ;
|
||||
radi + ? => aeiVerbForms s (init radi + "em") (radi + "o") ; ----
|
||||
_ => Predef.error ("expect infinitive form \"-ti\", found" ++ s)
|
||||
} ;
|
||||
|
||||
-- an traditional paradigm type, with a slight abstraction
|
||||
---- TODO other traditional paradigms
|
||||
|
||||
aeiVerbForms : Str -> Str -> Str -> VerbForms = \citati, citam, citao ->
|
||||
let
|
||||
cita = init citam ;
|
||||
u = case last cita of {
|
||||
"a" => "aju" ;
|
||||
"e" => "u" ;
|
||||
"i" => "e" ;
|
||||
_ => "e" ---- should not happen
|
||||
} ;
|
||||
cital = init citao + "l" ;
|
||||
in table {
|
||||
VInf => citati ;
|
||||
VPres Sg P1 => cita + "m" ;
|
||||
VPres Sg P2 => cita + "š" ;
|
||||
VPres Sg P3 => cita ;
|
||||
VPres Pl P1 => cita + "mo" ;
|
||||
VPres Pl P2 => cita + "te" ;
|
||||
VPres pl P3 => init cita + u ;
|
||||
VPastPart (Masc _) Sg => citao ;
|
||||
VPastPart Fem Sg => cital + "a" ;
|
||||
VPastPart Neutr Sg => cital + "o" ;
|
||||
VPastPart (Masc _) Pl => cital + "i" ;
|
||||
VPastPart Fem Pl => cital + "e" ;
|
||||
VPastPart Neutr Pl => cital + "a"
|
||||
} ;
|
||||
|
||||
|
||||
-- copula
|
||||
|
||||
jesam_Copula : {short, long, negative : Number => Person => Str} =
|
||||
let
|
||||
sam : Number => Person => Str = table {
|
||||
Sg => table {
|
||||
P1 => "sam" ;
|
||||
P2 => "si" ;
|
||||
P3 => "je"
|
||||
} ;
|
||||
Pl => table {
|
||||
P1 => "smo" ;
|
||||
P2 => "ste" ;
|
||||
P3 => "su"
|
||||
}
|
||||
}
|
||||
in {
|
||||
short = sam ;
|
||||
long = \\n,p => case <n,p> of {
|
||||
<Sg,P3> => "jeste" ; --- wiki: jest(e)
|
||||
_ => sam ! n ! p
|
||||
} ;
|
||||
negative = \\n,p => "ni" + sam ! n ! p
|
||||
} ;
|
||||
|
||||
-- Wiki: some grammars (chiefly Serbian ones) treat jesam as a defective verb
|
||||
-- having only present tense. Others treat these forms as two realizations
|
||||
-- of the same irregular verb biti, jesam being imperfective and budem perfective.
|
||||
|
||||
copula_VerbForms : VerbForms = table {
|
||||
VPres n p => jesam_Copula.short ! n ! p ;
|
||||
v => biti_VerbForms ! v
|
||||
} ;
|
||||
|
||||
biti_VerbForms : VerbForms = aeiVerbForms "biti" "budem" "bio" ;
|
||||
|
||||
imati_VerbForms : VerbForms = aeiVerbForms "imati" "imam" "imao" ;
|
||||
|
||||
|
||||
---------------------------
|
||||
-- Pronouns
|
||||
|
||||
PronForms : Type = {
|
||||
nom,
|
||||
gen, cgen, -- bare, clitic (also as Acc)
|
||||
dat, cdat, -- also as Loc
|
||||
ins : Str ;
|
||||
a : Agr
|
||||
} ;
|
||||
|
||||
personalPron : Agr -> PronForms = \a ->
|
||||
{a = a ; cnom = []} **
|
||||
case a of {
|
||||
Ag _ Sg P1 => {
|
||||
nom = "ja" ;
|
||||
gen = "mene" ;
|
||||
cgen = "ma" ;
|
||||
dat = "meni" ;
|
||||
cdat = "mi" ;
|
||||
ins = "mnom"
|
||||
} ;
|
||||
Ag _ Sg P2 => {
|
||||
nom = "ti" ;
|
||||
gen = "tebe" ;
|
||||
cgen = "te" ;
|
||||
dat = "tebi" ;
|
||||
cdat = "ti" ;
|
||||
ins = "tobom"
|
||||
} ;
|
||||
Ag Fem Sg P3 => {
|
||||
nom = "ona" ;
|
||||
gen = "nje" ;
|
||||
cgen = "je" ;
|
||||
dat = "njoj" ;
|
||||
cdat = "joj" ;
|
||||
ins = "njom"
|
||||
} ;
|
||||
Ag g Sg P3 => {
|
||||
nom = case g of {
|
||||
Masc _ => "on" ;
|
||||
_ => "ono"
|
||||
} ;
|
||||
gen = "njega" ;
|
||||
cgen = "ga" ;
|
||||
dat = "njemu" ;
|
||||
cdat = "mu" ;
|
||||
ins = "njim"
|
||||
} ;
|
||||
|
||||
Ag _ Pl P1 => {
|
||||
nom = "mi" ;
|
||||
gen, cgen = "nas" ;
|
||||
dat, ins = "nama" ;
|
||||
cdat = "nam"
|
||||
} ;
|
||||
Ag _ Pl P2 => {
|
||||
nom = "vi" ;
|
||||
gen, cgen = "vas" ;
|
||||
dat, ins = "vama" ;
|
||||
cdat = "vam"
|
||||
} ;
|
||||
Ag g Pl P3 => {
|
||||
nom = case g of {
|
||||
Masc _ => "oni" ;
|
||||
Fem => "one" ;
|
||||
Neutr => "ona"
|
||||
} ;
|
||||
gen = "njih" ;
|
||||
cgen = "ih" ;
|
||||
dat, ins = "njima" ;
|
||||
cdat = "im"
|
||||
}
|
||||
} ;
|
||||
|
||||
possessivePron : Agr -> AdjForms = \a -> case a of {
|
||||
Ag _ Sg P1 => velikA "moj" ;
|
||||
Ag _ Sg P2 => velikA "tvoj" ;
|
||||
Ag (Masc _) Sg P3 => velikA "njegov" ;
|
||||
Ag (Fem|Neutr) Sg P3 => velikA "njezin" ; -- BCMS: Hrv: otherwise njen
|
||||
Ag _ Pl P1 => velikA "naš" ;
|
||||
Ag _ Pl P2 => velikA "vaš" ;
|
||||
Ag _ Pl P3 => velikA "njihov"
|
||||
} ;
|
||||
|
||||
{-
|
||||
reflPossessivePron : DemPronForms = otcovA "svoj" ** {
|
||||
msnom = "svoj" ; msgen = "svojho" ; msdat = "svojmu" ;
|
||||
msins = "svojím" ;
|
||||
ampnom = "svoji" ;
|
||||
nsnom, fpnom = "svoje" ;
|
||||
pgen = "svojich" ;
|
||||
pdat = "svojim" ;
|
||||
pins = "svojimi" ;
|
||||
} ;
|
||||
-}
|
||||
|
||||
mkPron : Agr -> PronForms ** {poss : AdjForms} = \a ->
|
||||
personalPron a ** {poss = possessivePron a} ;
|
||||
|
||||
|
||||
param NumSize = NS_1 | NS_2_4 | NS_5_20 | NS_20_ ;
|
||||
|
||||
oper
|
||||
Determiner : Type = {
|
||||
s : Gender => Case => Str ;
|
||||
size : NumSize
|
||||
} ;
|
||||
|
||||
{-
|
||||
-- interrogatives TODO
|
||||
|
||||
ktoForms : Case => Str = table {
|
||||
Nom => "kto" ;
|
||||
Gen | Acc => "koho" ;
|
||||
Dat => "komu" ;
|
||||
Loc => "kom" ;
|
||||
Ins => "kým"
|
||||
} ;
|
||||
|
||||
coForms : Case => Str = table {
|
||||
Nom|Acc => "čo" ;
|
||||
Gen => "čoho" ;
|
||||
Dat => "čomu" ;
|
||||
Loc => "čom" ;
|
||||
Ins => "čím"
|
||||
} ;
|
||||
-}
|
||||
|
||||
|
||||
--------------------------------
|
||||
-- combining nouns with numerals
|
||||
|
||||
oper
|
||||
numSizeForm : (Number => Case => Str) -> NumSize -> Case -> Str
|
||||
= \cns,n,c -> case n of {
|
||||
NS_1 => cns ! Sg ! c ;
|
||||
NS_2_4 => cns ! Pl ! c ;
|
||||
_ => case c of {
|
||||
Nom | Acc => cns ! Pl ! Gen ;
|
||||
_ => cns ! Pl ! c
|
||||
}
|
||||
} ;
|
||||
|
||||
numSizeAgr : Gender -> NumSize -> Person -> Agr
|
||||
= \g,ns,p -> case ns of {
|
||||
NS_1 => Ag g Sg p ;
|
||||
NS_2_4 => Ag g Pl p ;
|
||||
_ => Ag Neutr Sg p ---- TODO verify
|
||||
} ;
|
||||
|
||||
numSizeNumber : NumSize -> Number = \ns -> case ns of {
|
||||
NS_1 => Sg ;
|
||||
_ => Pl ---- TO CHECK
|
||||
} ;
|
||||
|
||||
}
|
||||
32
src/croatian/SentenceHrv.gf
Normal file
32
src/croatian/SentenceHrv.gf
Normal file
@@ -0,0 +1,32 @@
|
||||
concrete SentenceHrv of Sentence = CatHrv **
|
||||
open Prelude, ResHrv in {
|
||||
|
||||
lin
|
||||
PredVP np vp = {
|
||||
subj = case np.hasClit of {
|
||||
True => np.clit ! Nom ; -- pro-drop
|
||||
False => np.s ! Nom
|
||||
} ;
|
||||
verb = vp.verb ;
|
||||
clit = vp.clit ! np.a ;
|
||||
compl = vp.compl ! np.a ;
|
||||
a = np.a ;
|
||||
} ;
|
||||
|
||||
UseCl temp pol cl = {
|
||||
s = temp.s ++ cl.subj ++ cl.clit ++ pol.s ++ verbAgr cl.verb cl.a CTPres ++ cl.compl ;
|
||||
} ; ---- TODO tense, negation
|
||||
|
||||
--- TODO is inversion the standard? ; add indirect questions
|
||||
UseQCl temp pol cl = {
|
||||
s = temp.s ++ cl.clit ++ pol.s ++ verbAgr cl.verb cl.a CTPres ++ cl.subj ++ cl.compl ;
|
||||
} ; ---- TODO tenses
|
||||
|
||||
UseRCl temp pol rcl = {
|
||||
s = \\a => temp.s ++
|
||||
rcl.subj ! a ++ rcl.clit ! a ++
|
||||
pol.s ++ verbAgr rcl.verb a CTPres ++
|
||||
rcl.compl ! a ;
|
||||
} ; ---- TODO tenses
|
||||
|
||||
}
|
||||
34
src/croatian/StructuralHrv.gf
Normal file
34
src/croatian/StructuralHrv.gf
Normal file
@@ -0,0 +1,34 @@
|
||||
concrete StructuralHrv of Structural = CatHrv **
|
||||
open ParadigmsHrv, ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
and_Conj = mkConj "i" ;
|
||||
---- by8agent_Prep = mkPrep "" Ins ;
|
||||
---- few_Det = invarNumeral "málo" ; -- see notes
|
||||
for_Prep = mkPrep "pre" accusative ;
|
||||
from_Prep = mkPrep "iz" Gen ;
|
||||
have_V2 = mkV2 (mkV imati_VerbForms) ;
|
||||
in_Prep = mkPrep "u" Loc ;
|
||||
---- many_Det = regNumeral "mnoho" "mnohých" "mnohým" "mnohými" ; ---- alternative: invarNumeral "veľa" ;
|
||||
or_Conj = mkConj "alebo" ;
|
||||
---- somePl_Det = invarDeterminer "niekoľko" Num5 ;
|
||||
---- somePl_Det = {s = \\g,c => (demPronFormsAdjective (mkDemPronForms "niekoľko") "").s ! g ! Pl ! c ; size = Num5} ;
|
||||
---- something_NP = {s,clit,prep = \\c => "nie" + coForms ! c ; a = Ag Neutr Sg P3 ; hasClit = False} ; -- CEG 5.6.3
|
||||
possess_Prep = mkPrep "" Gen ;
|
||||
that_Quant = adjFormsAdjective (velikA "oni" ** {msnom = "onaj"}) ; ---- TODO: taj, ta, to
|
||||
this_Quant = adjFormsAdjective (velikA "ovi" ** {msnom = "ovaj"}) ;
|
||||
to_Prep = mkPrep "u" Acc ;
|
||||
with_Prep = mkPrep (pre {"s"|"z"|"š"|"ž"|"mnom" => "sa" ; _ => "s"}) Ins ;
|
||||
|
||||
i_Pron = mkPron (Ag (Masc Anim) Sg P1) ; --- to add Fem pronouns in Extend
|
||||
youSg_Pron = mkPron (Ag (Masc Anim) Sg P2) ;
|
||||
he_Pron = mkPron (Ag (Masc Anim) Sg P3) ;
|
||||
she_Pron = mkPron (Ag Fem Sg P3) ;
|
||||
it_Pron = mkPron (Ag Neutr Sg P3) ;
|
||||
we_Pron = mkPron (Ag (Masc Anim) Pl P1) ;
|
||||
youPl_Pron = mkPron (Ag (Masc Anim) Pl P2) ;
|
||||
they_Pron = mkPron (Ag (Masc Anim) Pl P3) ;
|
||||
|
||||
somewhere_Adv = mkAdv "negdje" ;
|
||||
|
||||
}
|
||||
15
src/croatian/SymbolHrv.gf
Normal file
15
src/croatian/SymbolHrv.gf
Normal file
@@ -0,0 +1,15 @@
|
||||
--# -path=.:../abstract:../common:../prelude
|
||||
|
||||
concrete SymbolHrv of Symbol = CatHrv ** open Prelude, ResHrv in {
|
||||
|
||||
lincat
|
||||
Symb = {s : Str} ;
|
||||
lin
|
||||
MkSymb s = s ;
|
||||
SymbPN s = lin PN {s = \\_ => s.s ; g = Neutr} ;
|
||||
|
||||
IntPN s = lin PN {s = \\_ => s.s ; g = Neutr} ;
|
||||
|
||||
SymbNum s = lin Card {s = \\_,_ => s.s ; size = NS_20_} ; --- size
|
||||
|
||||
}
|
||||
660
src/croatian/TableExtResHrv.gf
Normal file
660
src/croatian/TableExtResHrv.gf
Normal file
@@ -0,0 +1,660 @@
|
||||
resource TableExtResHrv = open Prelude in {
|
||||
|
||||
-- AR September 2022
|
||||
-- sources:
|
||||
-- Wiki = https://en.wikipedia.org/wiki/Serbo-Croatian_grammar
|
||||
-- BCMS = Bosnian, Croatian, Montenegrin and Serbian:
|
||||
-- An Essential Grammar (Routledge Essential Grammars) 1st Edition, by Željko Vrabec
|
||||
|
||||
-- parameters
|
||||
|
||||
param
|
||||
Number = Sg | Pl ;
|
||||
|
||||
Animacy = Anim | Inanim ;
|
||||
Gender = Masc Animacy | Fem | Neutr ;
|
||||
|
||||
Case = Nom | Gen | Dat | Acc | Voc | Loc | Ins ; -- traditional order
|
||||
|
||||
Person = P1 | P2 | P3 ;
|
||||
|
||||
VForm =
|
||||
VInf
|
||||
| VPres Number Person
|
||||
| VPastPart Gender Number
|
||||
;
|
||||
---- TODO aorist, imperfect
|
||||
|
||||
Agr = Ag Gender Number Person ;
|
||||
|
||||
CTense = CTPres | CTPast ; ----- TODO complete the tense system to match BCS verb morphology
|
||||
|
||||
-- phonology
|
||||
|
||||
oper
|
||||
softConsonant : pattern Str = #("c"|"č"|"ć"|"đ"|"j"|"lj"|"nj"|"š"|"ž"|"št") ;
|
||||
--- wiki "and sometimes r"; BCMS slightly different
|
||||
|
||||
ifSoft : Str -> (soft,hard : Str) -> Str = \word, ssoft, shard ->
|
||||
case word of {
|
||||
_ + #softConsonant => ssoft ;
|
||||
_ => shard
|
||||
} ;
|
||||
|
||||
animate = Masc Anim ;
|
||||
inanimate = Masc Inanim ;
|
||||
feminine = Fem ;
|
||||
neuter = Neutr ;
|
||||
|
||||
palatalize : Str -> Str = \s -> case s of {
|
||||
x + "ki" => x + "ci" ;
|
||||
x + "ke" => x + "če" ;
|
||||
x + "gi" => x + "zi" ;
|
||||
x + "ge" => x + "že" ;
|
||||
x + "hi" => x + "si" ;
|
||||
x + "he" => x + "še" ;
|
||||
x + "ce" => x + "če" ;
|
||||
_ => s
|
||||
} ;
|
||||
|
||||
voicing : Str -> Str = \s -> case s of {
|
||||
x + "b" => x + "p" ;
|
||||
x + "d" => x + "t" ;
|
||||
x + "đ" => x + "ć" ;
|
||||
x + "z" => x + "s" ;
|
||||
x + "dž" => x + "č" ;
|
||||
x + "ž" => x + "š" ;
|
||||
_ => s
|
||||
} ;
|
||||
|
||||
---------------
|
||||
-- Nouns
|
||||
---------------
|
||||
|
||||
-- novel idea (for RGL): lexical items stored as records rather than tables
|
||||
-- advantages:
|
||||
-- - easier to make exceptions to paradigms (by ** {})
|
||||
-- - easier to keep the number of forms minimal
|
||||
-- - easier to see what is happening than with lots of anonymous arguments to mkN, mkA, mkV
|
||||
-- Starting from GF 2022-10-04: this can now be done with table extension, which gives
|
||||
-- type safety and more powerful pattern matching
|
||||
|
||||
param
|
||||
NForm = snom | sgen | sdat | sacc | svoc | sins | pnom | pgen | pdat | pacc ;
|
||||
|
||||
oper
|
||||
NounForms : Type = NForm => Str ;
|
||||
|
||||
-- But traditional tables make agreement easier to handle in syntax
|
||||
-- so this is the lincat of CN
|
||||
|
||||
Noun : Type = {s : Number => Case => Str ; g : Gender} ;
|
||||
|
||||
-- for lexical nouns N, we also need the gender but keep the minimal set of forms
|
||||
|
||||
LexNoun : Type = {s : NounForms ; g : Gender} ;
|
||||
|
||||
-- this is used in UseN
|
||||
|
||||
nounFormsNoun : NounForms -> Gender -> Noun
|
||||
= \forms, g -> {
|
||||
s = table {
|
||||
Sg => table {
|
||||
Nom => forms ! snom ;
|
||||
Gen => forms ! sgen ;
|
||||
Dat => forms ! sdat ;
|
||||
Acc => case g of {
|
||||
Masc Anim | Fem => forms ! sacc ;
|
||||
_ => forms ! snom
|
||||
} ;
|
||||
Voc => forms ! svoc ;
|
||||
Loc => forms ! sdat ;
|
||||
Ins => forms ! sins
|
||||
} ;
|
||||
Pl => table {
|
||||
Nom => forms ! pnom ;
|
||||
Gen => forms ! pgen ;
|
||||
Dat => forms ! pdat ;
|
||||
Acc => forms ! pacc ;
|
||||
Voc => forms ! pnom ;
|
||||
Loc => forms ! pdat ;
|
||||
Ins => forms ! pdat
|
||||
}
|
||||
} ;
|
||||
g = g
|
||||
} ;
|
||||
|
||||
-- a declension type produces these forms from a string
|
||||
|
||||
DeclensionType : Type = Str -> NounForms ;
|
||||
|
||||
-- smart paradigms
|
||||
|
||||
smartLexNoun : Str -> LexNoun = \s -> case s of {
|
||||
_ + "a" => {s = zenaN s ; g = feminine} ;
|
||||
_ + "i" => {s = ziriN s ; g = inanimate} ; ---- TODO feminine i
|
||||
_ + "e" => {s = poljeN s ; g = neuter} ; ---- TODO sunce, uze, zvonce, rame
|
||||
_ + "ao" => {s = ugaoN s ; g = inanimate} ;
|
||||
_ + "eo" => {s = pepeoN s ; g = inanimate} ;
|
||||
_ + "o" => {s = koljenoN s ; g = neuter} ; ---- TODO jedro
|
||||
_ + "lac" => {s = posjetilacN s ; g = inanimate} ;
|
||||
_ + "anj" => {s = suzanjN s ; g = inanimate} ;
|
||||
_ + "nj" => {s = panjN s ; g = inanimate} ;
|
||||
_ + "št" => {s = pristN s ; g = inanimate} ;
|
||||
_ + "ac" => {s = klinacN s ; g = neuter} ;
|
||||
_ + "c" => {s = stricN s ; g = inanimate} ;
|
||||
_ + "in" => {s = gradaninN s ; g = neuter} ;
|
||||
_ + "ak" => {s = cvorakN s ; g = inanimate} ;
|
||||
_ + "a" + ? => {s = nokatN s ; g = inanimate} ;
|
||||
_ + "g" => {s = bubregN s ; g = inanimate} ;
|
||||
_ + "h" => {s = trbuhN s ; g = inanimate} ;
|
||||
_ + "k" => {s = vojnikN s ; g = inanimate} ;
|
||||
_ => {s = izvorN s ; g = inanimate}
|
||||
} ;
|
||||
|
||||
mkgLexNoun : Str -> Gender -> LexNoun = \s,g -> case <s,g> of {
|
||||
<_ + "i", Masc _> => {s = ziriN s ; g = g} ;
|
||||
<_ + "e", Masc _> => {s = bifeN s ; g = g} ;
|
||||
<_ + "o", Masc _> => {s = bifeN s ; g = g} ;
|
||||
<_, g> => smartLexNoun s ** {g = g}
|
||||
} ;
|
||||
|
||||
|
||||
-- the traditional declensions, following Wiki
|
||||
-- they are also exported in ParadigmsHrv with names izvorN etc
|
||||
|
||||
izvorN : DeclensionType = \izvor ->
|
||||
table {
|
||||
snom => izvor ;
|
||||
sgen => izvor + "a" ;
|
||||
sdat => izvor + "u" ;
|
||||
sacc => izvor + "a" ;
|
||||
svoc => ifSoft izvor
|
||||
(izvor + "u")
|
||||
(palatalize (izvor + "e")) ;
|
||||
sins => ifSoft izvor
|
||||
(izvor + "em")
|
||||
(izvor + "om") ;
|
||||
|
||||
pnom => palatalize (izvor + "i") ;
|
||||
pgen => izvor + "a" ;
|
||||
pdat => ifSoft izvor
|
||||
(palatalize (izvor + "e") + "vima")
|
||||
(palatalize (izvor + "i") + "ma") ;
|
||||
pacc => izvor + "e"
|
||||
} ;
|
||||
|
||||
nokatN : DeclensionType = \nokat ->
|
||||
let
|
||||
nokt = Predef.tk 2 nokat + last nokat
|
||||
in izvorN nokt ** {
|
||||
snom => nokat ;
|
||||
sacc => nokt + "a" ;
|
||||
pgen => nokat + "a"
|
||||
} ;
|
||||
|
||||
gradaninN : DeclensionType = \gradanin ->
|
||||
let
|
||||
gradan = Predef.tk 2 gradanin ;
|
||||
gradanN = izvorN gradan
|
||||
in numbersNounForms (izvorN gradanin) gradanN ;
|
||||
|
||||
numbersNounForms : (sg, pl : NounForms) -> NounForms =
|
||||
\sg, pl -> sg ** {
|
||||
pnom => pl ! pnom ;
|
||||
pgen => pl ! pgen ;
|
||||
pdat => pl ! pdat ;
|
||||
pacc => pl ! pacc
|
||||
} ;
|
||||
|
||||
vojnikN : DeclensionType = izvorN ;
|
||||
bubregN : DeclensionType = izvorN ;
|
||||
trbuhN : DeclensionType = izvorN ;
|
||||
cvorakN : DeclensionType = nokatN ;
|
||||
|
||||
panjN : DeclensionType = \panj ->
|
||||
numbersNounForms (izvorN panj) (izvorN (palatalize (panj + "e") + "v")) ;
|
||||
|
||||
suzanjN : DeclensionType = \suzanj ->
|
||||
let
|
||||
suznj = Predef.tk 3 suzanj + Predef.dp 2 suzanj
|
||||
in
|
||||
numbersNounForms
|
||||
(izvorN suzanj)
|
||||
(izvorN suznj ** {
|
||||
pgen => "sužanja" ;
|
||||
pdat => "sužnjima"
|
||||
}) ;
|
||||
|
||||
pristN : DeclensionType = panjN ;
|
||||
|
||||
stricN : DeclensionType = \stric ->
|
||||
panjN stric ** {
|
||||
svoc => palatalize (stric + "e")
|
||||
} ;
|
||||
|
||||
klinacN : DeclensionType = \klinac ->
|
||||
let
|
||||
klinc = Predef.tk 2 klinac + last klinac
|
||||
in nokatN klinac ** {
|
||||
svoc => palatalize (klinc + "e") ;
|
||||
pdat => klinc + "ima"
|
||||
} ;
|
||||
|
||||
posjetilacN : DeclensionType = \posjetilac ->
|
||||
let
|
||||
posjetioc = Predef.tk 3 posjetilac + "oc"
|
||||
in izvorN posjetioc ** {
|
||||
snom => posjetilac ;
|
||||
svoc => palatalize (posjetioc + "e") ;
|
||||
sins => palatalize (posjetioc + "e") + "m" ;
|
||||
pgen => posjetilac + "a" ;
|
||||
pdat => palatalize (posjetioc + "i") + "ma"
|
||||
} ;
|
||||
|
||||
pepeoN : DeclensionType = \pepeo ->
|
||||
let
|
||||
pepel = init pepeo + "l"
|
||||
in izvorN pepel ** {snom => pepeo} ;
|
||||
|
||||
ugaoN : DeclensionType = \ugao ->
|
||||
let
|
||||
ugal = init ugao + "l" ;
|
||||
ugl = Predef.tk 2 ugal + last ugal
|
||||
in numbersNounForms
|
||||
(nokatN ugal ** {snom => ugao})
|
||||
(izvorN (ugl + "ov")) ;
|
||||
|
||||
bifeN : DeclensionType = \bife ->
|
||||
izvorN bife ** {svoc => bife + "u"} ;
|
||||
|
||||
ziriN : DeclensionType = \ziri ->
|
||||
bifeN (ziri + "j") ** {
|
||||
snom => ziri ;
|
||||
pdat => ziri + "jima"
|
||||
} ;
|
||||
|
||||
taksiN : DeclensionType = ziriN ;
|
||||
|
||||
---- Danilo, Hrvoje, raščupànko skipped
|
||||
|
||||
koljenoN : DeclensionType = \koljeno ->
|
||||
let
|
||||
koljen = init koljeno
|
||||
in izvorN koljen ** {
|
||||
snom | sacc | svoc => koljeno ;
|
||||
pnom | pacc => koljen + "a"
|
||||
} ;
|
||||
|
||||
jedroN : DeclensionType = \jedro ->
|
||||
let
|
||||
jed = Predef.tk 2 jedro ;
|
||||
r = last (init jedro) ;
|
||||
in koljenoN jedro ** {
|
||||
pgen => jed + "a" + r + "a"
|
||||
} ;
|
||||
|
||||
---- drvo - drveta skipped, can also decline as koljeno
|
||||
---- oči, čudo skipped
|
||||
|
||||
poljeN : DeclensionType = \polje ->
|
||||
koljenoN polje ** {
|
||||
pdat => init polje + "ima"
|
||||
} ;
|
||||
|
||||
---- sunce, uže, zvonce, rame, podne, doba
|
||||
|
||||
---- no tables given in the sources for feminine nouns, so guessing from ending tables
|
||||
|
||||
zenaN : DeclensionType = \zena ->
|
||||
let
|
||||
zen = init zena
|
||||
in table {
|
||||
snom => zena ;
|
||||
sgen => zen + "e" ;
|
||||
sdat => zen + "i" ;
|
||||
sacc => zen + "u" ;
|
||||
svoc => zen + "o" ; ---- o/a in Wiki ; o in https://sh.wiktionary.org/wiki/%C5%BEena
|
||||
sins => zen + "om" ;
|
||||
pnom | pacc => zen + "e" ;
|
||||
pdat => zen + "ama" ;
|
||||
pgen => zen + "a"
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
---------------------------
|
||||
-- Adjectives
|
||||
|
||||
-- to be used for AP: 56 forms for each degree
|
||||
Adjective : Type = {s : Gender => Number => Case => Str} ;
|
||||
|
||||
-- to be used for A, in three degrees: 12 forms in each
|
||||
---- TODO other degrees than positive
|
||||
|
||||
param AForm =
|
||||
msnom | fsnom | nsnom |
|
||||
msgen | fsgen | -- nsgen = msgen
|
||||
msdat | -- msloc,nsdat,nsloc = msdat
|
||||
fsdat | -- fsloc = fsdat
|
||||
fsacc | --
|
||||
msins | -- nsins, pdat, ploc, pins = msins
|
||||
fsins | -- no o/e variation like in msdat
|
||||
mpnom | -- mpvoc = mpnom
|
||||
mpgen -- fpgen, npgen = mpgen
|
||||
;
|
||||
|
||||
oper
|
||||
AdjForms : Type = AForm => Str ;
|
||||
|
||||
invarAdjForms : Str -> AdjForms = \s -> \\a => s ;
|
||||
|
||||
-- used in PositA but will also work in Compar and Superl by calling their record fields
|
||||
|
||||
adjFormsAdjective : AdjForms -> Adjective = \afs -> {
|
||||
s = \\g,n,c => case <n,c,g> of {
|
||||
|
||||
<Sg, Nom|Voc, Masc _>
|
||||
| <Sg, Acc, Masc Inanim> => afs ! msnom ;
|
||||
<Sg, Nom|Voc, Fem>
|
||||
| <Pl, Nom|Acc|Voc, Neutr> => afs ! fsnom ;
|
||||
<Sg, Nom|Acc|Voc, Neutr> => afs ! nsnom ;
|
||||
<Sg, Gen, Masc _ | Neutr>
|
||||
| <Sg, Acc, Masc Anim> => afs ! msgen ;
|
||||
<Sg, Gen, Fem>
|
||||
| <Pl, Nom|Acc|Voc, Fem>
|
||||
| <Pl, Acc, Masc _> => afs ! fsgen ;
|
||||
<Sg, Dat|Loc, Masc _|Neutr> => afs ! msdat ;
|
||||
<Sg, Dat|Loc, Fem> => afs ! fsdat ;
|
||||
<Sg, Acc, Fem> => afs ! fsacc ;
|
||||
<Sg, Ins, Masc _|Neutr>
|
||||
| <Pl,Dat|Loc|Ins, _> => afs ! msins ;
|
||||
<Sg, Ins, Fem> => afs ! fsins ;
|
||||
<Pl, Nom|Voc, Masc _> => afs ! mpnom ;
|
||||
<Pl, Gen,_> => afs ! mpgen
|
||||
}
|
||||
} ;
|
||||
|
||||
velikA : Str -> AdjForms = \velik ->
|
||||
let
|
||||
velk : Str = case velik of {
|
||||
vel + "stan" => vel + "sn" ;
|
||||
vel + "ao" => vel + "l" ;
|
||||
vel + "ak" => voicing vel + "k" ;
|
||||
vel + "a" + k@? => vel + k ;
|
||||
vel + "i" => vel ;
|
||||
_ => velik
|
||||
} ;
|
||||
oe : Str = ifSoft velik "e" "o"
|
||||
in table {
|
||||
msnom => velik ;
|
||||
fsnom => velk + "a" ;
|
||||
nsnom => velk + oe ;
|
||||
msgen => velk + oe + "g" ;
|
||||
fsgen => velk + "e" ;
|
||||
msdat => velk + oe + "m" ;
|
||||
fsdat => velk + "oj" ;
|
||||
fsacc => velk + "u" ;
|
||||
msins => velk + "im" ;
|
||||
fsins => velk + "om" ;
|
||||
mpnom => velk + "i" ;
|
||||
mpgen => velk + "ih"
|
||||
} ;
|
||||
|
||||
regComparAForms : AdjForms -> AdjForms
|
||||
= \aposit -> case init (aposit ! fsnom) of {
|
||||
grub@(_ + "b"|"p"|"v"|"h") => velikA (grub + "lji") ;
|
||||
star => velikA (star + "iji")
|
||||
} ;
|
||||
|
||||
superlAForms : AdjForms -> AdjForms
|
||||
= \acompar -> velikA ("naj" + acompar ! msnom) ;
|
||||
|
||||
od_Str = "od" ;
|
||||
|
||||
---------------------
|
||||
-- Verbs
|
||||
-- Wiki
|
||||
|
||||
VerbForms : Type = VForm => Str ;
|
||||
|
||||
ComplementCase : Type = {s : Str ; c : Case ; hasPrep : Bool} ;
|
||||
|
||||
verbAgr : VerbForms -> Agr -> CTense -> Str ---- TODO tenses
|
||||
= \vf,a,b -> case <a,b> of {
|
||||
<Ag _ n p, CTPres> => vf ! VPres n p ;
|
||||
<Ag g n _, CTPast> => vf ! VPastPart g n
|
||||
} ;
|
||||
|
||||
smartVerbForms : Str -> VerbForms = \s -> case s of {
|
||||
cit + "ati" => aeiVerbForms s (cit + "am") (cit + "ao") ;
|
||||
vid + "jeti" => aeiVerbForms s (vid + "im") (vid + "io") ;
|
||||
radi + "ti" => aeiVerbForms s (init radi + "em") (radi + "o") ;
|
||||
_ => Predef.error ("expect infinitive form \"-ti\", found" ++ s)
|
||||
} ;
|
||||
|
||||
-- an traditional paradigm type, with a slight abstraction
|
||||
---- TODO other traditional paradigms
|
||||
|
||||
aeiVerbForms : Str -> Str -> Str -> VerbForms = \citati, citam, citao ->
|
||||
let
|
||||
cita = init citam ;
|
||||
u = case last cita of {
|
||||
"a" => "aju" ;
|
||||
"e" => "u" ;
|
||||
"i" => "e"
|
||||
} ;
|
||||
cital = init citao + "l" ;
|
||||
in table {
|
||||
VInf => citati ;
|
||||
VPres Sg P1 => cita + "m" ;
|
||||
VPres Sg P2 => cita + "š" ;
|
||||
VPres Sg P3 => cita ;
|
||||
VPres Pl P1 => cita + "mo" ;
|
||||
VPres Pl P2 => cita + "te" ;
|
||||
VPres pl P3 => init cita + u ;
|
||||
VPastPart (Masc _) Sg => citao ;
|
||||
VPastPart Fem Sg => cital + "a" ;
|
||||
VPastPart Neutr Sg => cital + "o" ;
|
||||
VPastPart (Masc _) Pl => cital + "i" ;
|
||||
VPastPart Fem Pl => cital + "e" ;
|
||||
VPastPart Neutr Pl => cital + "a"
|
||||
} ;
|
||||
|
||||
|
||||
-- copula
|
||||
|
||||
jesam_Copula : {short, long, negative : Number => Person => Str} =
|
||||
let
|
||||
sam : Number => Person => Str = table {
|
||||
Sg => table {
|
||||
P1 => "sam" ;
|
||||
P2 => "si" ;
|
||||
P3 => "je"
|
||||
} ;
|
||||
Pl => table {
|
||||
P1 => "smo" ;
|
||||
P2 => "ste" ;
|
||||
P3 => "su"
|
||||
}
|
||||
}
|
||||
in {
|
||||
short = sam ;
|
||||
long = \\n,p => case <n,p> of {
|
||||
<Sg,P3> => "jeste" ; --- wiki: jest(e)
|
||||
_ => sam ! n ! p
|
||||
} ;
|
||||
negative = \\n,p => "ni" + sam ! n ! p
|
||||
} ;
|
||||
|
||||
-- Wiki: some grammars (chiefly Serbian ones) treat jesam as a defective verb
|
||||
-- having only present tense. Others treat these forms as two realizations
|
||||
-- of the same irregular verb biti, jesam being imperfective and budem perfective.
|
||||
|
||||
copula_VerbForms : VerbForms = table {
|
||||
VPres n p => jesam_Copula.short ! n ! p ;
|
||||
v => biti_VerbForms ! v
|
||||
} ;
|
||||
|
||||
biti_VerbForms : VerbForms = aeiVerbForms "biti" "budem" "bio" ;
|
||||
|
||||
imati_VerbForms : VerbForms = aeiVerbForms "imati" "imam" "imao" ;
|
||||
|
||||
|
||||
---------------------------
|
||||
-- Pronouns
|
||||
|
||||
PronForms : Type = {
|
||||
nom,
|
||||
gen, cgen, -- bare, clitic (also as Acc)
|
||||
dat, cdat, -- also as Loc
|
||||
ins : Str ;
|
||||
a : Agr
|
||||
} ;
|
||||
|
||||
personalPron : Agr -> PronForms = \a ->
|
||||
{a = a ; cnom = []} **
|
||||
case a of {
|
||||
Ag _ Sg P1 => {
|
||||
nom = "ja" ;
|
||||
gen = "mene" ;
|
||||
cgen = "ma" ;
|
||||
dat = "meni" ;
|
||||
cdat = "mi" ;
|
||||
ins = "mnom"
|
||||
} ;
|
||||
Ag _ Sg P2 => {
|
||||
nom = "ti" ;
|
||||
gen = "tebe" ;
|
||||
cgen = "te" ;
|
||||
dat = "tebi" ;
|
||||
cdat = "ti" ;
|
||||
ins = "tobom"
|
||||
} ;
|
||||
Ag Fem Sg P3 => {
|
||||
nom = "ona" ;
|
||||
gen = "nje" ;
|
||||
cgen = "je" ;
|
||||
dat = "njoj" ;
|
||||
cdat = "joj" ;
|
||||
ins = "njom"
|
||||
} ;
|
||||
Ag g Sg P3 => {
|
||||
nom = case g of {
|
||||
Masc _ => "on" ;
|
||||
_ => "ono"
|
||||
} ;
|
||||
gen = "njega" ;
|
||||
cgen = "ga" ;
|
||||
dat = "njemu" ;
|
||||
cdat = "mu" ;
|
||||
ins = "njim"
|
||||
} ;
|
||||
|
||||
Ag _ Pl P1 => {
|
||||
nom = "mi" ;
|
||||
gen, cgen = "nas" ;
|
||||
dat, ins = "nama" ;
|
||||
cdat = "nam"
|
||||
} ;
|
||||
Ag _ Pl P2 => {
|
||||
nom = "vi" ;
|
||||
gen, cgen = "vas" ;
|
||||
dat, ins = "vama" ;
|
||||
cdat = "vam"
|
||||
} ;
|
||||
Ag g Pl P3 => {
|
||||
nom = case g of {
|
||||
Masc _ => "oni" ;
|
||||
Fem => "one" ;
|
||||
Neutr => "ona"
|
||||
} ;
|
||||
gen = "njih" ;
|
||||
cgen = "ih" ;
|
||||
dat, ins = "njima" ;
|
||||
cdat = "im"
|
||||
}
|
||||
} ;
|
||||
|
||||
possessivePron : Agr -> AdjForms = \a -> case a of {
|
||||
Ag _ Sg P1 => velikA "moj" ;
|
||||
Ag _ Sg P2 => velikA "tvoj" ;
|
||||
Ag (Masc _) Sg P3 => velikA "njegov" ;
|
||||
Ag (Fem|Neutr) Sg P3 => velikA "njezin" ; -- BCMS: Hrv: otherwise njen
|
||||
Ag _ Pl P1 => velikA "naš" ;
|
||||
Ag _ Pl P2 => velikA "vaš" ;
|
||||
Ag _ Pl P3 => velikA "njihov"
|
||||
} ;
|
||||
|
||||
{-
|
||||
reflPossessivePron : DemPronForms = otcovA "svoj" ** {
|
||||
msnom = "svoj" ; msgen = "svojho" ; msdat = "svojmu" ;
|
||||
msins = "svojím" ;
|
||||
ampnom = "svoji" ;
|
||||
nsnom, fpnom = "svoje" ;
|
||||
pgen = "svojich" ;
|
||||
pdat = "svojim" ;
|
||||
pins = "svojimi" ;
|
||||
} ;
|
||||
-}
|
||||
|
||||
mkPron : Agr -> PronForms ** {poss : AdjForms} = \a ->
|
||||
personalPron a ** {poss = possessivePron a} ;
|
||||
|
||||
|
||||
param NumSize = NS_1 | NS_2_4 | NS_5_20 | NS_20_ ;
|
||||
|
||||
oper
|
||||
Determiner : Type = {
|
||||
s : Gender => Case => Str ;
|
||||
size : NumSize
|
||||
} ;
|
||||
|
||||
{-
|
||||
-- interrogatives TODO
|
||||
|
||||
ktoForms : Case => Str = table {
|
||||
Nom => "kto" ;
|
||||
Gen | Acc => "koho" ;
|
||||
Dat => "komu" ;
|
||||
Loc => "kom" ;
|
||||
Ins => "kým"
|
||||
} ;
|
||||
|
||||
coForms : Case => Str = table {
|
||||
Nom|Acc => "čo" ;
|
||||
Gen => "čoho" ;
|
||||
Dat => "čomu" ;
|
||||
Loc => "čom" ;
|
||||
Ins => "čím"
|
||||
} ;
|
||||
-}
|
||||
|
||||
|
||||
--------------------------------
|
||||
-- combining nouns with numerals
|
||||
|
||||
oper
|
||||
numSizeForm : (Number => Case => Str) -> NumSize -> Case -> Str
|
||||
= \cns,n,c -> case n of {
|
||||
NS_1 => cns ! Sg ! c ;
|
||||
NS_2_4 => cns ! Pl ! c ;
|
||||
_ => case c of {
|
||||
Nom | Acc => cns ! Pl ! Gen ;
|
||||
_ => cns ! Pl ! c
|
||||
}
|
||||
} ;
|
||||
|
||||
numSizeAgr : Gender -> NumSize -> Person -> Agr
|
||||
= \g,ns,p -> case ns of {
|
||||
NS_1 => Ag g Sg p ;
|
||||
NS_2_4 => Ag g Pl p ;
|
||||
_ => Ag Neutr Sg p ---- TODO verify
|
||||
} ;
|
||||
|
||||
numSizeNumber : NumSize -> Number = \ns -> case ns of {
|
||||
NS_1 => Sg ;
|
||||
_ => Pl ---- TO CHECK
|
||||
} ;
|
||||
|
||||
}
|
||||
21
src/croatian/TenseHrv.gf
Normal file
21
src/croatian/TenseHrv.gf
Normal file
@@ -0,0 +1,21 @@
|
||||
concrete TenseHrv of Tense =
|
||||
CatHrv **
|
||||
open
|
||||
ResHrv,
|
||||
Prelude
|
||||
in {
|
||||
lin
|
||||
PNeg = {
|
||||
s = "ne" ++ Predef.BIND ;
|
||||
p = False
|
||||
} ;
|
||||
PPos = {
|
||||
s = [] ;
|
||||
p = True
|
||||
} ;
|
||||
ASimul = {s = [] ; t = CTPres} ;
|
||||
TPres = {s = [] ; t = CTPres} ;
|
||||
TPast = {s = [] ; t = CTPast} ;
|
||||
TTAnt t a = {s = t.s ++ a.s ; t = t.t} ; ----
|
||||
|
||||
}
|
||||
8
src/croatian/TextHrv.gf
Normal file
8
src/croatian/TextHrv.gf
Normal file
@@ -0,0 +1,8 @@
|
||||
concrete TextHrv of Text = CatHrv ** open ResHrv in {
|
||||
|
||||
lin
|
||||
TEmpty = {s = []} ;
|
||||
TFullStop x xs = {s = x.s ++ "." ++ xs.s} ;
|
||||
TQuestMark x xs = {s = x.s ++ "?" ++ xs.s} ;
|
||||
TExclMark x xs = {s = x.s ++ "!" ++ xs.s} ;
|
||||
}
|
||||
48
src/croatian/VerbHrv.gf
Normal file
48
src/croatian/VerbHrv.gf
Normal file
@@ -0,0 +1,48 @@
|
||||
concrete VerbHrv of Verb = CatHrv ** open ResHrv, Prelude in {
|
||||
|
||||
lin
|
||||
UseV v = {
|
||||
verb = v.s ;
|
||||
clit,compl = \\_ => []
|
||||
} ;
|
||||
|
||||
ComplSlash vps np = case <np.hasClit, vps.c.hasPrep> of {
|
||||
<True,False> => vps ** {
|
||||
clit = \\a => vps.clit ! a ++ np.clit ! vps.c.c
|
||||
} ;
|
||||
_ => vps ** {
|
||||
compl = \\a => vps.compl ! a ++ vps.c.s ++ np.s ! vps.c.c
|
||||
}
|
||||
} ;
|
||||
|
||||
SlashV2a v = {
|
||||
verb = v.s ;
|
||||
clit,compl = \\_ => [] ;
|
||||
c = v.c
|
||||
} ;
|
||||
|
||||
UseComp comp = {
|
||||
verb = copula_VerbForms ;
|
||||
clit = \\_ => [] ;
|
||||
compl = comp.s
|
||||
} ;
|
||||
|
||||
CompAP ap = {
|
||||
s = \\a => case a of {
|
||||
Ag g n p_ => ap.s ! g ! n ! Nom
|
||||
}
|
||||
} ;
|
||||
|
||||
CompNP np = {
|
||||
s = \\a_ => np.s ! Nom ;
|
||||
} ;
|
||||
|
||||
CompAdv adv = {
|
||||
s = \\a_ => adv.s
|
||||
} ;
|
||||
|
||||
AdvVP vp adv = vp ** {
|
||||
compl = \\a => vp.compl ! a ++ adv.s
|
||||
} ;
|
||||
|
||||
}
|
||||
57
src/croatian/aw-needed.txt
Normal file
57
src/croatian/aw-needed.txt
Normal file
@@ -0,0 +1,57 @@
|
||||
AdverbEng.PrepNP
|
||||
ConstructorsEng.ComplV2
|
||||
ConstructorsEng.DetArtCard
|
||||
ConstructorsEng.the_Det
|
||||
NounEng.AdvCN
|
||||
NounEng.DetCN
|
||||
NounEng.IndefArt
|
||||
NounEng.UseN
|
||||
NounEng.UsePN
|
||||
ParadigmsEng.regN
|
||||
ParadigmsEng.regPN
|
||||
SentenceEng.PredVP
|
||||
StructuralEng.have_V2
|
||||
StructuralEng.in_Prep
|
||||
StructuralEng.possess_Prep
|
||||
SymbolEng.IntPN
|
||||
SymbolEng.SymbNum
|
||||
SymbolicEng.mkSymb
|
||||
VerbEng.CompAdv
|
||||
VerbEng.CompNP
|
||||
VerbEng.UseComp
|
||||
|
||||
AdjectiveEng.AdjOrd
|
||||
AdjectiveEng.PositA
|
||||
ConjunctionEng.BaseNP
|
||||
ConjunctionEng.BaseS
|
||||
ConjunctionEng.ConjNP
|
||||
ConjunctionEng.ConjS
|
||||
ConjunctionEng.ConsNP
|
||||
ConjunctionEng.ListNP,
|
||||
ExtendEng.CardCNCard
|
||||
IdiomEng.ExistNP
|
||||
IdiomEng.ExistNPAdv
|
||||
NounEng.AdNum
|
||||
NounEng.AdjCN
|
||||
NounEng.DetNP
|
||||
NounEng.DetQuant
|
||||
NounEng.NumSg
|
||||
NounEng.OrdSuperl
|
||||
NounEng.PossPron
|
||||
NounEng.RelCN
|
||||
NounEng.UsePron
|
||||
ParadigmsEng.mkAdN
|
||||
ParadigmsEng.mkAdv
|
||||
ParadigmsEng.mkOrd
|
||||
ParadigmsEng.regA
|
||||
PhraseEng.NoPConj
|
||||
PhraseEng.NoVoc
|
||||
PhraseEng.PhrUtt
|
||||
PhraseEng.UttS
|
||||
RelativeEng.RelVP
|
||||
StructuralEng.and_Conj
|
||||
StructuralEng.it_Pron
|
||||
StructuralEng.somewhere_Adv;
|
||||
StructuralEng.they_Pron
|
||||
StructuralEng.with_Prep
|
||||
VerbEng.CompAP
|
||||
585
src/croatian/gold-test.txt
Normal file
585
src/croatian/gold-test.txt
Normal file
@@ -0,0 +1,585 @@
|
||||
s . Sg => Nom => izvor
|
||||
s . Sg => Gen => izvora
|
||||
s . Sg => Dat => izvoru
|
||||
s . Sg => Acc => izvor
|
||||
s . Sg => Voc => izvore
|
||||
s . Sg => Loc => izvoru
|
||||
s . Sg => Ins => izvorom
|
||||
s . Pl => Nom => izvori
|
||||
s . Pl => Gen => izvora
|
||||
s . Pl => Dat => izvorima
|
||||
s . Pl => Acc => izvore
|
||||
s . Pl => Voc => izvori
|
||||
s . Pl => Loc => izvorima
|
||||
s . Pl => Ins => izvorima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => nokat
|
||||
s . Sg => Gen => nokta
|
||||
s . Sg => Dat => noktu
|
||||
s . Sg => Acc => nokat
|
||||
s . Sg => Voc => nokte
|
||||
s . Sg => Loc => noktu
|
||||
s . Sg => Ins => noktom
|
||||
s . Pl => Nom => nokti
|
||||
s . Pl => Gen => nokata
|
||||
s . Pl => Dat => noktima
|
||||
s . Pl => Acc => nokte
|
||||
s . Pl => Voc => nokti
|
||||
s . Pl => Loc => noktima
|
||||
s . Pl => Ins => noktima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => građanin
|
||||
s . Sg => Gen => građanina
|
||||
s . Sg => Dat => građaninu
|
||||
s . Sg => Acc => građanina
|
||||
s . Sg => Voc => građanine
|
||||
s . Sg => Loc => građaninu
|
||||
s . Sg => Ins => građaninom
|
||||
s . Pl => Nom => građani
|
||||
s . Pl => Gen => građana
|
||||
s . Pl => Dat => građanima
|
||||
s . Pl => Acc => građane
|
||||
s . Pl => Voc => građani
|
||||
s . Pl => Loc => građanima
|
||||
s . Pl => Ins => građanima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => vojnik
|
||||
s . Sg => Gen => vojnika
|
||||
s . Sg => Dat => vojniku
|
||||
s . Sg => Acc => vojnika
|
||||
s . Sg => Voc => vojniče
|
||||
s . Sg => Loc => vojniku
|
||||
s . Sg => Ins => vojnikom
|
||||
s . Pl => Nom => vojnici
|
||||
s . Pl => Gen => vojnika
|
||||
s . Pl => Dat => vojnicima
|
||||
s . Pl => Acc => vojnike
|
||||
s . Pl => Voc => vojnici
|
||||
s . Pl => Loc => vojnicima
|
||||
s . Pl => Ins => vojnicima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => bubreg
|
||||
s . Sg => Gen => bubrega
|
||||
s . Sg => Dat => bubregu
|
||||
s . Sg => Acc => bubrega
|
||||
s . Sg => Voc => bubreže
|
||||
s . Sg => Loc => bubregu
|
||||
s . Sg => Ins => bubregom
|
||||
s . Pl => Nom => bubrezi
|
||||
s . Pl => Gen => bubrega
|
||||
s . Pl => Dat => bubrezima
|
||||
s . Pl => Acc => bubrege
|
||||
s . Pl => Voc => bubrezi
|
||||
s . Pl => Loc => bubrezima
|
||||
s . Pl => Ins => bubrezima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => trbuh
|
||||
s . Sg => Gen => trbuha
|
||||
s . Sg => Dat => trbuhu
|
||||
s . Sg => Acc => trbuha
|
||||
s . Sg => Voc => trbuše
|
||||
s . Sg => Loc => trbuhu
|
||||
s . Sg => Ins => trbuhom
|
||||
s . Pl => Nom => trbusi
|
||||
s . Pl => Gen => trbuha
|
||||
s . Pl => Dat => trbusima
|
||||
s . Pl => Acc => trbuhe
|
||||
s . Pl => Voc => trbusi
|
||||
s . Pl => Loc => trbusima
|
||||
s . Pl => Ins => trbusima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => čvorak
|
||||
s . Sg => Gen => čvorka
|
||||
s . Sg => Dat => čvorku
|
||||
s . Sg => Acc => čvorka
|
||||
s . Sg => Voc => čvorče
|
||||
s . Sg => Loc => čvorku
|
||||
s . Sg => Ins => čvorkom
|
||||
s . Pl => Nom => čvorci
|
||||
s . Pl => Gen => čvoraka
|
||||
s . Pl => Dat => čvorcima
|
||||
s . Pl => Acc => čvorke
|
||||
s . Pl => Voc => čvorci
|
||||
s . Pl => Loc => čvorcima
|
||||
s . Pl => Ins => čvorcima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => panj
|
||||
s . Sg => Gen => panja
|
||||
s . Sg => Dat => panju
|
||||
s . Sg => Acc => panj
|
||||
s . Sg => Voc => panju
|
||||
s . Sg => Loc => panju
|
||||
s . Sg => Ins => panjem
|
||||
s . Pl => Nom => panjevi
|
||||
s . Pl => Gen => panjeva
|
||||
s . Pl => Dat => panjevima
|
||||
s . Pl => Acc => panjeve
|
||||
s . Pl => Voc => panjevi
|
||||
s . Pl => Loc => panjevima
|
||||
s . Pl => Ins => panjevima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => sužanj
|
||||
s . Sg => Gen => sužanja
|
||||
s . Sg => Dat => sužanju
|
||||
s . Sg => Acc => sužanj
|
||||
s . Sg => Voc => sužanju
|
||||
s . Sg => Loc => sužanju
|
||||
s . Sg => Ins => sužanjem
|
||||
s . Pl => Nom => sužnji
|
||||
s . Pl => Gen => sužanja
|
||||
s . Pl => Dat => sužnjima
|
||||
s . Pl => Acc => sužnje
|
||||
s . Pl => Voc => sužnji
|
||||
s . Pl => Loc => sužnjima
|
||||
s . Pl => Ins => sužnjima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => prišt
|
||||
s . Sg => Gen => prišta
|
||||
s . Sg => Dat => prištu
|
||||
s . Sg => Acc => prišt
|
||||
s . Sg => Voc => prištu
|
||||
s . Sg => Loc => prištu
|
||||
s . Sg => Ins => prištem
|
||||
s . Pl => Nom => prištevi
|
||||
s . Pl => Gen => prišteva
|
||||
s . Pl => Dat => prištevima
|
||||
s . Pl => Acc => prišteve
|
||||
s . Pl => Voc => prištevi
|
||||
s . Pl => Loc => prištevima
|
||||
s . Pl => Ins => prištevima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => stric
|
||||
s . Sg => Gen => strica
|
||||
s . Sg => Dat => stricu
|
||||
s . Sg => Acc => strica
|
||||
s . Sg => Voc => striče
|
||||
s . Sg => Loc => stricu
|
||||
s . Sg => Ins => stricem
|
||||
s . Pl => Nom => stričevi
|
||||
s . Pl => Gen => stričeva
|
||||
s . Pl => Dat => stričevima
|
||||
s . Pl => Acc => stričeve
|
||||
s . Pl => Voc => stričevi
|
||||
s . Pl => Loc => stričevima
|
||||
s . Pl => Ins => stričevima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => klinac
|
||||
s . Sg => Gen => klinca
|
||||
s . Sg => Dat => klincu
|
||||
s . Sg => Acc => klinac
|
||||
s . Sg => Voc => klinče
|
||||
s . Sg => Loc => klincu
|
||||
s . Sg => Ins => klincem
|
||||
s . Pl => Nom => klinci
|
||||
s . Pl => Gen => klinaca
|
||||
s . Pl => Dat => klincima
|
||||
s . Pl => Acc => klince
|
||||
s . Pl => Voc => klinci
|
||||
s . Pl => Loc => klincima
|
||||
s . Pl => Ins => klincima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => posjetilac
|
||||
s . Sg => Gen => posjetioca
|
||||
s . Sg => Dat => posjetiocu
|
||||
s . Sg => Acc => posjetioca
|
||||
s . Sg => Voc => posjetioče
|
||||
s . Sg => Loc => posjetiocu
|
||||
s . Sg => Ins => posjetiočem
|
||||
s . Pl => Nom => posjetioci
|
||||
s . Pl => Gen => posjetilaca
|
||||
s . Pl => Dat => posjetiocima
|
||||
s . Pl => Acc => posjetioce
|
||||
s . Pl => Voc => posjetioci
|
||||
s . Pl => Loc => posjetiocima
|
||||
s . Pl => Ins => posjetiocima
|
||||
g . Masc Anim
|
||||
s . Sg => Nom => pepeo
|
||||
s . Sg => Gen => pepela
|
||||
s . Sg => Dat => pepelu
|
||||
s . Sg => Acc => pepeo
|
||||
s . Sg => Voc => pepele
|
||||
s . Sg => Loc => pepelu
|
||||
s . Sg => Ins => pepelom
|
||||
s . Pl => Nom => pepeli
|
||||
s . Pl => Gen => pepela
|
||||
s . Pl => Dat => pepelima
|
||||
s . Pl => Acc => pepele
|
||||
s . Pl => Voc => pepeli
|
||||
s . Pl => Loc => pepelima
|
||||
s . Pl => Ins => pepelima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => ugao
|
||||
s . Sg => Gen => ugla
|
||||
s . Sg => Dat => uglu
|
||||
s . Sg => Acc => ugao
|
||||
s . Sg => Voc => ugle
|
||||
s . Sg => Loc => uglu
|
||||
s . Sg => Ins => uglom
|
||||
s . Pl => Nom => uglovi
|
||||
s . Pl => Gen => uglova
|
||||
s . Pl => Dat => uglovima
|
||||
s . Pl => Acc => uglove
|
||||
s . Pl => Voc => uglovi
|
||||
s . Pl => Loc => uglovima
|
||||
s . Pl => Ins => uglovima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => bife
|
||||
s . Sg => Gen => bifea
|
||||
s . Sg => Dat => bifeu
|
||||
s . Sg => Acc => bife
|
||||
s . Sg => Voc => bifeu
|
||||
s . Sg => Loc => bifeu
|
||||
s . Sg => Ins => bifeom
|
||||
s . Pl => Nom => bifei
|
||||
s . Pl => Gen => bifea
|
||||
s . Pl => Dat => bifeima
|
||||
s . Pl => Acc => bifee
|
||||
s . Pl => Voc => bifei
|
||||
s . Pl => Loc => bifeima
|
||||
s . Pl => Ins => bifeima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => žiri
|
||||
s . Sg => Gen => žirija
|
||||
s . Sg => Dat => žiriju
|
||||
s . Sg => Acc => žiri
|
||||
s . Sg => Voc => žiriju
|
||||
s . Sg => Loc => žiriju
|
||||
s . Sg => Ins => žirijem
|
||||
s . Pl => Nom => žiriji
|
||||
s . Pl => Gen => žirija
|
||||
s . Pl => Dat => žirijima
|
||||
s . Pl => Acc => žirije
|
||||
s . Pl => Voc => žiriji
|
||||
s . Pl => Loc => žirijima
|
||||
s . Pl => Ins => žirijima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => taksi
|
||||
s . Sg => Gen => taksija
|
||||
s . Sg => Dat => taksiju
|
||||
s . Sg => Acc => taksi
|
||||
s . Sg => Voc => taksiju
|
||||
s . Sg => Loc => taksiju
|
||||
s . Sg => Ins => taksijem
|
||||
s . Pl => Nom => taksiji
|
||||
s . Pl => Gen => taksija
|
||||
s . Pl => Dat => taksijima
|
||||
s . Pl => Acc => taksije
|
||||
s . Pl => Voc => taksiji
|
||||
s . Pl => Loc => taksijima
|
||||
s . Pl => Ins => taksijima
|
||||
g . Masc Inanim
|
||||
s . Sg => Nom => koljeno
|
||||
s . Sg => Gen => koljena
|
||||
s . Sg => Dat => koljenu
|
||||
s . Sg => Acc => koljeno
|
||||
s . Sg => Voc => koljeno
|
||||
s . Sg => Loc => koljenu
|
||||
s . Sg => Ins => koljenom
|
||||
s . Pl => Nom => koljena
|
||||
s . Pl => Gen => koljena
|
||||
s . Pl => Dat => koljenima
|
||||
s . Pl => Acc => koljena
|
||||
s . Pl => Voc => koljena
|
||||
s . Pl => Loc => koljenima
|
||||
s . Pl => Ins => koljenima
|
||||
g . Neutr
|
||||
s . Sg => Nom => jedro
|
||||
s . Sg => Gen => jedra
|
||||
s . Sg => Dat => jedru
|
||||
s . Sg => Acc => jedro
|
||||
s . Sg => Voc => jedro
|
||||
s . Sg => Loc => jedru
|
||||
s . Sg => Ins => jedrom
|
||||
s . Pl => Nom => jedra
|
||||
s . Pl => Gen => jedara
|
||||
s . Pl => Dat => jedrima
|
||||
s . Pl => Acc => jedra
|
||||
s . Pl => Voc => jedra
|
||||
s . Pl => Loc => jedrima
|
||||
s . Pl => Ins => jedrima
|
||||
g . Neutr
|
||||
s . Sg => Nom => polje
|
||||
s . Sg => Gen => polja
|
||||
s . Sg => Dat => polju
|
||||
s . Sg => Acc => polje
|
||||
s . Sg => Voc => polje
|
||||
s . Sg => Loc => polju
|
||||
s . Sg => Ins => poljem
|
||||
s . Pl => Nom => polja
|
||||
s . Pl => Gen => polja
|
||||
s . Pl => Dat => poljima
|
||||
s . Pl => Acc => polja
|
||||
s . Pl => Voc => polja
|
||||
s . Pl => Loc => poljima
|
||||
s . Pl => Ins => poljima
|
||||
g . Neutr
|
||||
s . Sg => Nom => žena
|
||||
s . Sg => Gen => žene
|
||||
s . Sg => Dat => ženi
|
||||
s . Sg => Acc => ženu
|
||||
s . Sg => Voc => ženo
|
||||
s . Sg => Loc => ženi
|
||||
s . Sg => Ins => ženom
|
||||
s . Pl => Nom => žene
|
||||
s . Pl => Gen => žena
|
||||
s . Pl => Dat => ženama
|
||||
s . Pl => Acc => žene
|
||||
s . Pl => Voc => žene
|
||||
s . Pl => Loc => ženama
|
||||
s . Pl => Ins => ženama
|
||||
g . Fem
|
||||
s . Masc Anim => Sg => Nom => velik
|
||||
s . Masc Anim => Sg => Gen => velikog
|
||||
s . Masc Anim => Sg => Dat => velikomu
|
||||
s . Masc Anim => Sg => Acc => velikog
|
||||
s . Masc Anim => Sg => Voc => velik
|
||||
s . Masc Anim => Sg => Loc => velikom
|
||||
s . Masc Anim => Sg => Ins => velikim
|
||||
s . Masc Anim => Pl => Nom => veliki
|
||||
s . Masc Anim => Pl => Gen => velikih
|
||||
s . Masc Anim => Pl => Dat => velikim
|
||||
s . Masc Anim => Pl => Acc => velike
|
||||
s . Masc Anim => Pl => Voc => veliki
|
||||
s . Masc Anim => Pl => Loc => velikim
|
||||
s . Masc Anim => Pl => Ins => velikim
|
||||
s . Masc Inanim => Sg => Nom => velik
|
||||
s . Masc Inanim => Sg => Gen => velikog
|
||||
s . Masc Inanim => Sg => Dat => velikomu
|
||||
s . Masc Inanim => Sg => Acc => velik
|
||||
s . Masc Inanim => Sg => Voc => velik
|
||||
s . Masc Inanim => Sg => Loc => velikom
|
||||
s . Masc Inanim => Sg => Ins => velikim
|
||||
s . Masc Inanim => Pl => Nom => veliki
|
||||
s . Masc Inanim => Pl => Gen => velikih
|
||||
s . Masc Inanim => Pl => Dat => velikim
|
||||
s . Masc Inanim => Pl => Acc => velike
|
||||
s . Masc Inanim => Pl => Voc => veliki
|
||||
s . Masc Inanim => Pl => Loc => velikim
|
||||
s . Masc Inanim => Pl => Ins => velikim
|
||||
s . Fem => Sg => Nom => velika
|
||||
s . Fem => Sg => Gen => velike
|
||||
s . Fem => Sg => Dat => velikoj
|
||||
s . Fem => Sg => Acc => veliku
|
||||
s . Fem => Sg => Voc => velika
|
||||
s . Fem => Sg => Loc => velikoj
|
||||
s . Fem => Sg => Ins => velikom
|
||||
s . Fem => Pl => Nom => velike
|
||||
s . Fem => Pl => Gen => velikih
|
||||
s . Fem => Pl => Dat => velikim
|
||||
s . Fem => Pl => Acc => velike
|
||||
s . Fem => Pl => Voc => velike
|
||||
s . Fem => Pl => Loc => velikim
|
||||
s . Fem => Pl => Ins => velikim
|
||||
s . Neutr => Sg => Nom => veliko
|
||||
s . Neutr => Sg => Gen => velikog
|
||||
s . Neutr => Sg => Dat => velikomu
|
||||
s . Neutr => Sg => Acc => veliko
|
||||
s . Neutr => Sg => Voc => veliko
|
||||
s . Neutr => Sg => Loc => velikom
|
||||
s . Neutr => Sg => Ins => velikim
|
||||
s . Neutr => Pl => Nom => velika
|
||||
s . Neutr => Pl => Gen => velikih
|
||||
s . Neutr => Pl => Dat => velikim
|
||||
s . Neutr => Pl => Acc => velika
|
||||
s . Neutr => Pl => Voc => velika
|
||||
s . Neutr => Pl => Loc => velikim
|
||||
s . Neutr => Pl => Ins => velikim
|
||||
s . Masc Anim => Sg => Nom => mastan
|
||||
s . Masc Anim => Sg => Gen => masnog
|
||||
s . Masc Anim => Sg => Dat => masnomu
|
||||
s . Masc Anim => Sg => Acc => masnog
|
||||
s . Masc Anim => Sg => Voc => mastan
|
||||
s . Masc Anim => Sg => Loc => masnom
|
||||
s . Masc Anim => Sg => Ins => masnim
|
||||
s . Masc Anim => Pl => Nom => masni
|
||||
s . Masc Anim => Pl => Gen => masnih
|
||||
s . Masc Anim => Pl => Dat => masnim
|
||||
s . Masc Anim => Pl => Acc => masne
|
||||
s . Masc Anim => Pl => Voc => masni
|
||||
s . Masc Anim => Pl => Loc => masnim
|
||||
s . Masc Anim => Pl => Ins => masnim
|
||||
s . Masc Inanim => Sg => Nom => mastan
|
||||
s . Masc Inanim => Sg => Gen => masnog
|
||||
s . Masc Inanim => Sg => Dat => masnomu
|
||||
s . Masc Inanim => Sg => Acc => mastan
|
||||
s . Masc Inanim => Sg => Voc => mastan
|
||||
s . Masc Inanim => Sg => Loc => masnom
|
||||
s . Masc Inanim => Sg => Ins => masnim
|
||||
s . Masc Inanim => Pl => Nom => masni
|
||||
s . Masc Inanim => Pl => Gen => masnih
|
||||
s . Masc Inanim => Pl => Dat => masnim
|
||||
s . Masc Inanim => Pl => Acc => masne
|
||||
s . Masc Inanim => Pl => Voc => masni
|
||||
s . Masc Inanim => Pl => Loc => masnim
|
||||
s . Masc Inanim => Pl => Ins => masnim
|
||||
s . Fem => Sg => Nom => masna
|
||||
s . Fem => Sg => Gen => masne
|
||||
s . Fem => Sg => Dat => masnoj
|
||||
s . Fem => Sg => Acc => masnu
|
||||
s . Fem => Sg => Voc => masna
|
||||
s . Fem => Sg => Loc => masnoj
|
||||
s . Fem => Sg => Ins => masnom
|
||||
s . Fem => Pl => Nom => masne
|
||||
s . Fem => Pl => Gen => masnih
|
||||
s . Fem => Pl => Dat => masnim
|
||||
s . Fem => Pl => Acc => masne
|
||||
s . Fem => Pl => Voc => masne
|
||||
s . Fem => Pl => Loc => masnim
|
||||
s . Fem => Pl => Ins => masnim
|
||||
s . Neutr => Sg => Nom => masno
|
||||
s . Neutr => Sg => Gen => masnog
|
||||
s . Neutr => Sg => Dat => masnomu
|
||||
s . Neutr => Sg => Acc => masno
|
||||
s . Neutr => Sg => Voc => masno
|
||||
s . Neutr => Sg => Loc => masnom
|
||||
s . Neutr => Sg => Ins => masnim
|
||||
s . Neutr => Pl => Nom => masna
|
||||
s . Neutr => Pl => Gen => masnih
|
||||
s . Neutr => Pl => Dat => masnim
|
||||
s . Neutr => Pl => Acc => masna
|
||||
s . Neutr => Pl => Voc => masna
|
||||
s . Neutr => Pl => Loc => masnim
|
||||
s . Neutr => Pl => Ins => masnim
|
||||
s . Masc Anim => Sg => Nom => gladan
|
||||
s . Masc Anim => Sg => Gen => gladnog
|
||||
s . Masc Anim => Sg => Dat => gladnomu
|
||||
s . Masc Anim => Sg => Acc => gladnog
|
||||
s . Masc Anim => Sg => Voc => gladan
|
||||
s . Masc Anim => Sg => Loc => gladnom
|
||||
s . Masc Anim => Sg => Ins => gladnim
|
||||
s . Masc Anim => Pl => Nom => gladni
|
||||
s . Masc Anim => Pl => Gen => gladnih
|
||||
s . Masc Anim => Pl => Dat => gladnim
|
||||
s . Masc Anim => Pl => Acc => gladne
|
||||
s . Masc Anim => Pl => Voc => gladni
|
||||
s . Masc Anim => Pl => Loc => gladnim
|
||||
s . Masc Anim => Pl => Ins => gladnim
|
||||
s . Masc Inanim => Sg => Nom => gladan
|
||||
s . Masc Inanim => Sg => Gen => gladnog
|
||||
s . Masc Inanim => Sg => Dat => gladnomu
|
||||
s . Masc Inanim => Sg => Acc => gladan
|
||||
s . Masc Inanim => Sg => Voc => gladan
|
||||
s . Masc Inanim => Sg => Loc => gladnom
|
||||
s . Masc Inanim => Sg => Ins => gladnim
|
||||
s . Masc Inanim => Pl => Nom => gladni
|
||||
s . Masc Inanim => Pl => Gen => gladnih
|
||||
s . Masc Inanim => Pl => Dat => gladnim
|
||||
s . Masc Inanim => Pl => Acc => gladne
|
||||
s . Masc Inanim => Pl => Voc => gladni
|
||||
s . Masc Inanim => Pl => Loc => gladnim
|
||||
s . Masc Inanim => Pl => Ins => gladnim
|
||||
s . Fem => Sg => Nom => gladna
|
||||
s . Fem => Sg => Gen => gladne
|
||||
s . Fem => Sg => Dat => gladnoj
|
||||
s . Fem => Sg => Acc => gladnu
|
||||
s . Fem => Sg => Voc => gladna
|
||||
s . Fem => Sg => Loc => gladnoj
|
||||
s . Fem => Sg => Ins => gladnom
|
||||
s . Fem => Pl => Nom => gladne
|
||||
s . Fem => Pl => Gen => gladnih
|
||||
s . Fem => Pl => Dat => gladnim
|
||||
s . Fem => Pl => Acc => gladne
|
||||
s . Fem => Pl => Voc => gladne
|
||||
s . Fem => Pl => Loc => gladnim
|
||||
s . Fem => Pl => Ins => gladnim
|
||||
s . Neutr => Sg => Nom => gladno
|
||||
s . Neutr => Sg => Gen => gladnog
|
||||
s . Neutr => Sg => Dat => gladnomu
|
||||
s . Neutr => Sg => Acc => gladno
|
||||
s . Neutr => Sg => Voc => gladno
|
||||
s . Neutr => Sg => Loc => gladnom
|
||||
s . Neutr => Sg => Ins => gladnim
|
||||
s . Neutr => Pl => Nom => gladna
|
||||
s . Neutr => Pl => Gen => gladnih
|
||||
s . Neutr => Pl => Dat => gladnim
|
||||
s . Neutr => Pl => Acc => gladna
|
||||
s . Neutr => Pl => Voc => gladna
|
||||
s . Neutr => Pl => Loc => gladnim
|
||||
s . Neutr => Pl => Ins => gladnim
|
||||
s . Masc Anim => Sg => Nom => nizak
|
||||
s . Masc Anim => Sg => Gen => niskog
|
||||
s . Masc Anim => Sg => Dat => niskomu
|
||||
s . Masc Anim => Sg => Acc => niskog
|
||||
s . Masc Anim => Sg => Voc => nizak
|
||||
s . Masc Anim => Sg => Loc => niskom
|
||||
s . Masc Anim => Sg => Ins => niskim
|
||||
s . Masc Anim => Pl => Nom => niski
|
||||
s . Masc Anim => Pl => Gen => niskih
|
||||
s . Masc Anim => Pl => Dat => niskim
|
||||
s . Masc Anim => Pl => Acc => niske
|
||||
s . Masc Anim => Pl => Voc => niski
|
||||
s . Masc Anim => Pl => Loc => niskim
|
||||
s . Masc Anim => Pl => Ins => niskim
|
||||
s . Masc Inanim => Sg => Nom => nizak
|
||||
s . Masc Inanim => Sg => Gen => niskog
|
||||
s . Masc Inanim => Sg => Dat => niskomu
|
||||
s . Masc Inanim => Sg => Acc => nizak
|
||||
s . Masc Inanim => Sg => Voc => nizak
|
||||
s . Masc Inanim => Sg => Loc => niskom
|
||||
s . Masc Inanim => Sg => Ins => niskim
|
||||
s . Masc Inanim => Pl => Nom => niski
|
||||
s . Masc Inanim => Pl => Gen => niskih
|
||||
s . Masc Inanim => Pl => Dat => niskim
|
||||
s . Masc Inanim => Pl => Acc => niske
|
||||
s . Masc Inanim => Pl => Voc => niski
|
||||
s . Masc Inanim => Pl => Loc => niskim
|
||||
s . Masc Inanim => Pl => Ins => niskim
|
||||
s . Fem => Sg => Nom => niska
|
||||
s . Fem => Sg => Gen => niske
|
||||
s . Fem => Sg => Dat => niskoj
|
||||
s . Fem => Sg => Acc => nisku
|
||||
s . Fem => Sg => Voc => niska
|
||||
s . Fem => Sg => Loc => niskoj
|
||||
s . Fem => Sg => Ins => niskom
|
||||
s . Fem => Pl => Nom => niske
|
||||
s . Fem => Pl => Gen => niskih
|
||||
s . Fem => Pl => Dat => niskim
|
||||
s . Fem => Pl => Acc => niske
|
||||
s . Fem => Pl => Voc => niske
|
||||
s . Fem => Pl => Loc => niskim
|
||||
s . Fem => Pl => Ins => niskim
|
||||
s . Neutr => Sg => Nom => nisko
|
||||
s . Neutr => Sg => Gen => niskog
|
||||
s . Neutr => Sg => Dat => niskomu
|
||||
s . Neutr => Sg => Acc => nisko
|
||||
s . Neutr => Sg => Voc => nisko
|
||||
s . Neutr => Sg => Loc => niskom
|
||||
s . Neutr => Sg => Ins => niskim
|
||||
s . Neutr => Pl => Nom => niska
|
||||
s . Neutr => Pl => Gen => niskih
|
||||
s . Neutr => Pl => Dat => niskim
|
||||
s . Neutr => Pl => Acc => niska
|
||||
s . Neutr => Pl => Voc => niska
|
||||
s . Neutr => Pl => Loc => niskim
|
||||
s . Neutr => Pl => Ins => niskim
|
||||
VInf => čitati
|
||||
VPres Sg P1 => čitam
|
||||
VPres Sg P2 => čitaš
|
||||
VPres Sg P3 => čita
|
||||
VPres Pl P1 => čitamo
|
||||
VPres Pl P2 => čitate
|
||||
VPres Pl P3 => čitaju
|
||||
VPastPart (Masc Anim) Sg => čitao
|
||||
VPastPart (Masc Anim) Pl => čitali
|
||||
VPastPart (Masc Inanim) Sg => čitao
|
||||
VPastPart (Masc Inanim) Pl => čitali
|
||||
VPastPart Fem Sg => čitala
|
||||
VPastPart Fem Pl => čitale
|
||||
VPastPart Neutr Sg => čitalo
|
||||
VPastPart Neutr Pl => čitala
|
||||
VInf => raditi
|
||||
VPres Sg P1 => radim
|
||||
VPres Sg P2 => radiš
|
||||
VPres Sg P3 => radi
|
||||
VPres Pl P1 => radimo
|
||||
VPres Pl P2 => radite
|
||||
VPres Pl P3 => rade
|
||||
VPastPart (Masc Anim) Sg => radio
|
||||
VPastPart (Masc Anim) Pl => radili
|
||||
VPastPart (Masc Inanim) Sg => radio
|
||||
VPastPart (Masc Inanim) Pl => radili
|
||||
VPastPart Fem Sg => radila
|
||||
VPastPart Fem Pl => radile
|
||||
VPastPart Neutr Sg => radilo
|
||||
VPastPart Neutr Pl => radila
|
||||
aarnes-mbp-2:croatian aarne$
|
||||
33
src/croatian/testHrv.gfs
Normal file
33
src/croatian/testHrv.gfs
Normal file
@@ -0,0 +1,33 @@
|
||||
cc -table -unqual nounFormsNoun (izvorN "izvor") inanimate
|
||||
cc -table -unqual nounFormsNoun (nokatN "nokat") inanimate
|
||||
cc -table -unqual nounFormsNoun (gradaninN "građanin") animate
|
||||
cc -table -unqual nounFormsNoun (vojnikN "vojnik") animate
|
||||
cc -table -unqual nounFormsNoun (bubregN "bubreg") animate
|
||||
cc -table -unqual nounFormsNoun (trbuhN "trbuh") animate
|
||||
cc -table -unqual nounFormsNoun (cvorakN "čvorak") animate
|
||||
cc -table -unqual nounFormsNoun (panjN "panj") inanimate
|
||||
cc -table -unqual nounFormsNoun (suzanjN "sužanj") inanimate
|
||||
cc -table -unqual nounFormsNoun (pristN "prišt") inanimate
|
||||
cc -table -unqual nounFormsNoun (stricN "stric") animate
|
||||
cc -table -unqual nounFormsNoun (klinacN "klinac") inanimate
|
||||
cc -table -unqual nounFormsNoun (posjetilacN "posjetilac") animate
|
||||
cc -table -unqual nounFormsNoun (pepeoN "pepeo") inanimate
|
||||
cc -table -unqual nounFormsNoun (ugaoN "ugao") inanimate
|
||||
cc -table -unqual nounFormsNoun (bifeN "bife") inanimate
|
||||
cc -table -unqual nounFormsNoun (ziriN "žiri") inanimate
|
||||
cc -table -unqual nounFormsNoun (taksiN "taksi") inanimate
|
||||
|
||||
cc -table -unqual nounFormsNoun (koljenoN "koljeno") neuter
|
||||
cc -table -unqual nounFormsNoun (jedroN "jedro") neuter
|
||||
cc -table -unqual nounFormsNoun (poljeN "polje") neuter
|
||||
|
||||
cc -table -unqual nounFormsNoun (zenaN "žena") feminine
|
||||
|
||||
cc -table -unqual adjFormsAdjective (velikA "velik")
|
||||
cc -table -unqual adjFormsAdjective (velikA "mastan")
|
||||
cc -table -unqual adjFormsAdjective (velikA "gladan")
|
||||
cc -table -unqual adjFormsAdjective (velikA "nizak")
|
||||
|
||||
cc -table -unqual aeiVerbForms "čitati" "čitam" "čitao"
|
||||
cc -table -unqual aeiVerbForms "raditi" "radem" "radio"
|
||||
|
||||
17046
src/croatian/wiktionary/MorphoDictHrv.gf
Normal file
17046
src/croatian/wiktionary/MorphoDictHrv.gf
Normal file
File diff suppressed because it is too large
Load Diff
16998
src/croatian/wiktionary/MorphoDictHrvAbs.gf
Normal file
16998
src/croatian/wiktionary/MorphoDictHrvAbs.gf
Normal file
File diff suppressed because it is too large
Load Diff
284
src/croatian/wiktionary/extract.py
Normal file
284
src/croatian/wiktionary/extract.py
Normal file
@@ -0,0 +1,284 @@
|
||||
import json
|
||||
import sys
|
||||
|
||||
# https://kaikki.org/dictionary/rawdata.html
|
||||
# Tatu Ylonen: Wiktextract: Wiktionary as Machine-Readable Structured Data,
|
||||
# Proceedings of the 13th Conference on Language Resources and Evaluation (LREC),
|
||||
# pp. 1317-1325, Marseille, 20-25 June 2022.
|
||||
|
||||
WIKTIONARY_FILE = 'data/raw-wiktextract-data.json'
|
||||
|
||||
MYLANG = 'Serbo-Croatian'
|
||||
REFLANG = 'English'
|
||||
|
||||
MORPHO_OUTPUT_FILE = 'm.json'
|
||||
TRANS_OUTPUT_FILE = 't.json'
|
||||
|
||||
MORPHO_FINAL_FILE = 'morpho-hr.json' ###
|
||||
|
||||
GENDERS = ['masculine', 'feminine', 'neuter']
|
||||
|
||||
NOUN_FORMS = {
|
||||
'singular': {
|
||||
'nominative': 'snom',
|
||||
'genitive': 'sgen',
|
||||
'dative': 'sdat',
|
||||
'accusative': 'sacc',
|
||||
'vocative': 'svoc',
|
||||
'instrumental': 'sins'
|
||||
},
|
||||
'plural': {
|
||||
'nominative': 'pnom',
|
||||
'genitive': 'pgen',
|
||||
'dative': 'pdat',
|
||||
'accusative': 'pacc'
|
||||
}
|
||||
}
|
||||
|
||||
ADJ_FORMS = {
|
||||
'masculine': {
|
||||
'singular': {
|
||||
'nominative': 'msnom',
|
||||
'genitive': 'msgen',
|
||||
'dative': 'msdat',
|
||||
'instrumental': 'msins'
|
||||
},
|
||||
'plural': {
|
||||
'nominative': 'mpnom',
|
||||
'genitive': 'mpgen'
|
||||
}
|
||||
},
|
||||
'feminine': {
|
||||
'singular': {
|
||||
'nominative': 'fsnom',
|
||||
'genitive': 'fsgen',
|
||||
'dative': 'fsdat',
|
||||
'accusative': 'fsacc',
|
||||
'instrumental': 'fsins'
|
||||
}
|
||||
},
|
||||
'neuter': {
|
||||
'singular': {
|
||||
'nominative': 'nsnom'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VERB_FORMS = {
|
||||
'present': {
|
||||
'singular': {
|
||||
'first-person': 'pres_sg_1',
|
||||
'second-person': 'pres_sg_2',
|
||||
'third-person': 'pres_sg_3'
|
||||
},
|
||||
'plural': {
|
||||
'first-person': 'pres_pl_1',
|
||||
'second-person': 'pres_pl_2',
|
||||
'third-person': 'pres_pl_3'
|
||||
}
|
||||
},
|
||||
'participle': {
|
||||
'singular': {
|
||||
'masculine': 'ppart_masc_sg',
|
||||
'feminine': 'ppart_fem_sg',
|
||||
'neuter': 'ppart_neutr_sg'
|
||||
},
|
||||
'plural': {
|
||||
'masculine': 'ppart_masc_pl',
|
||||
'feminine': 'ppart_fem_pl',
|
||||
'neuter': 'ppart_neutr_pl'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def unaccent(word):
|
||||
w = []
|
||||
for c in word:
|
||||
if c in "ÀȀȂ":
|
||||
w.append('A')
|
||||
elif c in "ÈÈ":
|
||||
w.append('E')
|
||||
elif c in "ÌÍȊ̂":
|
||||
w.append('I')
|
||||
elif c in "Ò":
|
||||
w.append('O')
|
||||
elif c in "Ù":
|
||||
w.append('U')
|
||||
elif c in "àáâāȁȃ":
|
||||
w.append('a')
|
||||
elif c in "èéēȅȇê":
|
||||
w.append('e')
|
||||
elif c in "ìíīȉȋîî":
|
||||
w.append('i')
|
||||
elif c in "òóôōȍȏ":
|
||||
w.append('o')
|
||||
elif c in "ùúȕȗ̀́̄̏̑ū":
|
||||
w.append('u')
|
||||
elif c in "ŕȑȓ":
|
||||
w.append('r')
|
||||
else:
|
||||
w.append(c)
|
||||
return ''.join(w)
|
||||
|
||||
cyrillic = 'ЀЈЉЊЋЍЏАБВГДЕЖЗИКЛМНОПРСТУФХЦЧШабвгдежзиклмнопрстуфхцчшыѐђјљњћѝџӣӯ'
|
||||
|
||||
def get_forms(pos, forms, word):
|
||||
dict = {}
|
||||
if pos == 'noun':
|
||||
for f in forms:
|
||||
for g in GENDERS:
|
||||
if 'animate' in f.get('tags', []):
|
||||
dict['gender'] = 'mascAnimate'
|
||||
elif g in f.get('tags', []):
|
||||
dict['gender'] = g
|
||||
tags = f.get('tags', [])
|
||||
for num in NOUN_FORMS:
|
||||
if num in tags:
|
||||
for case in NOUN_FORMS[num]:
|
||||
if case in tags:
|
||||
dict[NOUN_FORMS[num][case]] = unaccent(f['form'])
|
||||
elif pos == 'name':
|
||||
for f in forms:
|
||||
for g in GENDERS:
|
||||
if 'animate' in f.get('tags', []):
|
||||
dict['gender'] = 'mascAnimate'
|
||||
elif g in f.get('tags', []):
|
||||
dict['gender'] = g
|
||||
tags = f.get('tags', [])
|
||||
for num in NOUN_FORMS:
|
||||
if num in tags:
|
||||
for case in NOUN_FORMS[num]:
|
||||
if case in tags:
|
||||
dict[NOUN_FORMS[num][case]] = unaccent(f['form'])
|
||||
elif pos == 'adj':
|
||||
for f in forms:
|
||||
## print(f)
|
||||
tags = f.get('tags', [])
|
||||
if 'positive' in tags and 'indefinite' not in tags:
|
||||
for g in ADJ_FORMS:
|
||||
if g in tags:
|
||||
for n in ADJ_FORMS[g]:
|
||||
if n in tags:
|
||||
for c in ADJ_FORMS[g][n]:
|
||||
if c in tags:
|
||||
dict[ADJ_FORMS[g][n][c]] = unaccent(f['form'])
|
||||
elif all([t in tags for t in [
|
||||
'comparative', 'masculine', 'singular', 'nominative']]):
|
||||
dict['cmsnom'] = unaccent(f['form'])
|
||||
elif pos == 'verb':
|
||||
for f in forms:
|
||||
tags = f.get('tags', [])
|
||||
for t in VERB_FORMS:
|
||||
if t in tags:
|
||||
for n in VERB_FORMS[t]:
|
||||
if n in tags:
|
||||
for g in VERB_FORMS[t][n]:
|
||||
if g in tags:
|
||||
dict[VERB_FORMS[t][n][g]] = unaccent(f['form'])
|
||||
if dict:
|
||||
dict['infin'] = unaccent(word)
|
||||
|
||||
else:
|
||||
dict['forms'] = forms[:10] ####
|
||||
dict['status'] = 'NOFORMS-'+pos
|
||||
if not dict:
|
||||
dict['status'] = 'NOFORMS'
|
||||
return dict
|
||||
|
||||
|
||||
def lexinfo(data):
|
||||
return data['word'], {
|
||||
'pos': data['pos'], 'forms': get_forms(data['pos'], data['forms'], data['word'])}
|
||||
|
||||
|
||||
# write morphology of mylang in m.json
|
||||
def morpho(mylang, lines):
|
||||
with open(MORPHO_OUTPUT_FILE, 'w', encoding="utf-8") as file:
|
||||
for line in lines:
|
||||
data = json.loads(line)
|
||||
if data.get('lang', '') == mylang and (
|
||||
all([x in data for x in ['pos', 'word', 'forms']])):
|
||||
word, info = lexinfo(data)
|
||||
json.dump({word: info}, file, ensure_ascii=False)
|
||||
file.write('\n')
|
||||
|
||||
|
||||
# write translations from reflang to mylang in t.json
|
||||
def translations(mylang, reflang, lines):
|
||||
with open(TRANS_OUTPUT_FILE, 'w', encoding="utf-8") as file:
|
||||
for line in lines:
|
||||
data = json.loads(line)
|
||||
if data.get('lang', '') == reflang and (
|
||||
all([x in data for x in ['pos', 'word']])):
|
||||
for t in [t for t in data.get('translations', [])
|
||||
if t['lang'] == mylang]:
|
||||
file.write(json.dumps(
|
||||
{data['word']:
|
||||
{'pos': data['pos'],
|
||||
'trans': t.get('word'),
|
||||
'sense': t.get('sense')}
|
||||
})+'\n')
|
||||
|
||||
# write GF lexical entry
|
||||
def print_gf_code(data, i):
|
||||
|
||||
lemma = list(data.keys())[0]
|
||||
if any([c in cyrillic for c in lemma]):
|
||||
return
|
||||
|
||||
cats = {
|
||||
'name': ('PN', 7),
|
||||
'noun': ('N', 11),
|
||||
'adj': ('A', 13),
|
||||
'verb': ('V', 13)
|
||||
}
|
||||
pos = data[lemma]['pos']
|
||||
|
||||
def prrec(fs, lemma, expected):
|
||||
if fs.get('status') == 'NOFORMS' or len(fs) != expected:
|
||||
return '"' + lemma + '"'
|
||||
else:
|
||||
s = '{'
|
||||
for f in fs:
|
||||
if f == 'gender':
|
||||
s += f + ' = P.' + str(fs[f]) + ' ; '
|
||||
else:
|
||||
s += f + ' = ' + '"' + str(fs[f]) + '"' + ' ; '
|
||||
return s[:-3] + '}' # removing last ;
|
||||
|
||||
if pos in cats:
|
||||
cat, expected = cats[pos]
|
||||
fun = "'" + lemma + '_' + str(i) + '_' + cat + "'"
|
||||
if len(data[lemma]['forms']) == expected:
|
||||
print(' '.join(['fun', fun, ':', cat, ';']))
|
||||
print(' '.join(['lin', fun, '=',
|
||||
'mk'+cat, prrec(data[lemma]['forms'], lemma, expected),';']))
|
||||
else:
|
||||
pass
|
||||
|
||||
|
||||
def main():
|
||||
if not sys.argv[1:]:
|
||||
print('usage: extract.py (morpho|trans) mylang reflang')
|
||||
return
|
||||
mode = sys.argv[1]
|
||||
mylang, reflang = MYLANG, REFLANG
|
||||
if sys.argv[3:]:
|
||||
mylang, reflang = sys.argv[2:]
|
||||
|
||||
if mode == 'gf':
|
||||
with open(MORPHO_FINAL_FILE, "r", encoding="utf-8") as lines:
|
||||
for line, i in zip(lines, range(100000)):
|
||||
data = json.loads(line)
|
||||
print_gf_code(data, i)
|
||||
|
||||
with open(WIKTIONARY_FILE, "r", encoding="utf-8") as lines:
|
||||
if mode == 'trans':
|
||||
translations(mylang, reflang, lines)
|
||||
elif mode == 'morpho':
|
||||
morpho(mylang, lines)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
451
src/croatian/wiktionary/izvor.html
Normal file
451
src/croatian/wiktionary/izvor.html
Normal file
@@ -0,0 +1,451 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="client-nojs" lang="sh" dir="ltr">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>izvor - Wiktionary</title>
|
||||
<script>document.documentElement.className="client-js";RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t.",".\t,"],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","januar","februar","mart","april","maj","juni","juli","august","septembar","oktobar","novembar","decembar"],"wgRequestId":"98673dd6-4847-4bb5-aa61-3479c95e75db","wgCSPNonce":false,"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"izvor","wgTitle":"izvor","wgCurRevisionId":1460287,"wgRevisionId":1460287,"wgArticleId":40700,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Srpskohrvatske imenice","Srpskohrvatske imenice muškog roda","Srpskohrvatski indeks","Stranice sa čarobnim vezama za ISBN"],"wgPageContentLanguage":"sh","wgPageContentModel":"wikitext","wgRelevantPageName":"izvor","wgRelevantArticleId":40700,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,
|
||||
"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgVisualEditor":{"pageLanguageCode":"sh","pageLanguageDir":"ltr","pageVariantFallbacks":"sh"},"wgMFDisplayWikibaseDescriptions":{"search":true,"nearby":true,"watchlist":true,"tagline":false},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":5000,"wgNoticeProject":"wiktionary","wgVector2022PreviewPages":[],"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgULSCurrentAutonym":"srpskohrvatski / српскохрватски","wgEditSubmitButtonLabelPublish":true,"wgCentralAuthMobileDomain":false,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":true};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","skins.vector.styles.legacy":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.wikimediaBadges":"ready","ext.uls.interlanguage":"ready"};RLPAGEMODULES=
|
||||
["ext.cite.ux-enhancements","site","mediawiki.page.ready","mediawiki.toc","skins.vector.legacy.js","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.centralauth.centralautologin","ext.uls.compactlinks","ext.uls.interface"];</script>
|
||||
<script>(RLQ=window.RLQ||[]).push(function(){mw.loader.implement("user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"});});});</script>
|
||||
<link rel="stylesheet" href="/w/load.php?lang=sh&modules=ext.cite.styles%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cskins.vector.styles.legacy&only=styles&skin=vector"/>
|
||||
<script async="" src="/w/load.php?lang=sh&modules=startup&only=scripts&raw=1&skin=vector"></script>
|
||||
<meta name="ResourceLoaderDynamicStyles" content=""/>
|
||||
<link rel="stylesheet" href="/w/load.php?lang=sh&modules=site.styles&only=styles&skin=vector"/>
|
||||
<meta name="generator" content="MediaWiki 1.40.0-wmf.2"/>
|
||||
<meta name="referrer" content="origin"/>
|
||||
<meta name="referrer" content="origin-when-crossorigin"/>
|
||||
<meta name="referrer" content="origin-when-cross-origin"/>
|
||||
<meta name="format-detection" content="telephone=no"/>
|
||||
<meta name="viewport" content="width=1000"/>
|
||||
<meta property="og:title" content="izvor - Wiktionary"/>
|
||||
<meta property="og:type" content="website"/>
|
||||
<link rel="alternate" media="only screen and (max-width: 720px)" href="//sh.m.wiktionary.org/wiki/izvor"/>
|
||||
<link rel="alternate" type="application/x-wiki" title="Uredi" href="/w/index.php?title=izvor&action=edit"/>
|
||||
<link rel="apple-touch-icon" href="/static/apple-touch/wiktionary.png"/>
|
||||
<link rel="icon" href="/static/favicon/piece.ico"/>
|
||||
<link rel="search" type="application/opensearchdescription+xml" href="/w/opensearch_desc.php" title="Wiktionary (sh)"/>
|
||||
<link rel="EditURI" type="application/rsd+xml" href="//sh.wiktionary.org/w/api.php?action=rsd"/>
|
||||
<link rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/"/>
|
||||
<link rel="canonical" href="https://sh.wiktionary.org/wiki/izvor"/>
|
||||
<link rel="dns-prefetch" href="//meta.wikimedia.org" />
|
||||
<link rel="dns-prefetch" href="//login.wikimedia.org"/>
|
||||
</head>
|
||||
<body class="mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-izvor rootpage-izvor skin-vector action-view skin-vector-legacy vector-toc-not-collapsed vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-language-alert-in-sidebar-enabled vector-feature-sticky-header-disabled vector-feature-sticky-header-edit-disabled vector-feature-table-of-contents-disabled vector-feature-visual-enhancement-next-disabled"><div id="mw-page-base" class="noprint"></div>
|
||||
<div id="mw-head-base" class="noprint"></div>
|
||||
<div id="content" class="mw-body" role="main">
|
||||
<a id="top"></a>
|
||||
<div id="siteNotice"><!-- CentralNotice --></div>
|
||||
<div class="mw-indicators">
|
||||
</div>
|
||||
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">izvor</span></h1>
|
||||
<div id="bodyContent" class="vector-body">
|
||||
<div id="siteSub" class="noprint">Izvor: Wiktionary</div>
|
||||
<div id="contentSub"></div>
|
||||
<div id="contentSub2"></div>
|
||||
|
||||
<div id="jump-to-nav"></div>
|
||||
<a class="mw-jump-link" href="#mw-head">Idi na navigaciju</a>
|
||||
<a class="mw-jump-link" href="#searchInput">Idi na pretragu</a>
|
||||
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="sh" dir="ltr"><div class="mw-parser-output"><div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="sh" dir="ltr"><h2 id="mw-toc-heading">Sadržaj</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
|
||||
<ul>
|
||||
<li class="toclevel-1 tocsection-1"><a href="#Srpskohrvatski"><span class="tocnumber">1</span> <span class="toctext">Srpskohrvatski</span></a>
|
||||
<ul>
|
||||
<li class="toclevel-2 tocsection-2"><a href="#Izgovor"><span class="tocnumber">1.1</span> <span class="toctext">Izgovor</span></a></li>
|
||||
<li class="toclevel-2 tocsection-3"><a href="#Imenica"><span class="tocnumber">1.2</span> <span class="toctext">Imenica</span></a>
|
||||
<ul>
|
||||
<li class="toclevel-3 tocsection-4"><a href="#Deklinacija"><span class="tocnumber">1.2.1</span> <span class="toctext">Deklinacija</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toclevel-2 tocsection-5"><a href="#Reference"><span class="tocnumber">1.3</span> <span class="toctext">Reference</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2><span class="mw-headline" id="Srpskohrvatski">Srpskohrvatski</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=izvor&action=edit&section=1" title="Uredi odjeljak Srpskohrvatski">uredi</a><span class="mw-editsection-bracket">]</span></span></h2>
|
||||
<h3><span class="mw-headline" id="Izgovor">Izgovor</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=izvor&action=edit&section=2" title="Uredi odjeljak Izgovor">uredi</a><span class="mw-editsection-bracket">]</span></span></h3>
|
||||
<ul><li><span style="cursor:help" title="Srpskohrvatski"><a href="https://sh.wikipedia.org/wiki/Special:Search/Srpskohrvatski_fonologija" class="extiw" title="w:Special:Search/Srpskohrvatski fonologija">IPA</a></span>: <span class="IPA" lang="">/ǐzʋor/</span></li>
|
||||
<li>Hifenacija: <span class="mention-Latn">i‧zvor</span></li></ul>
|
||||
<h3><span class="mw-headline" id="Imenica">Imenica</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=izvor&action=edit&section=3" title="Uredi odjeljak Imenica">uredi</a><span class="mw-editsection-bracket">]</span></span></h3>
|
||||
<p><strong class="headword" lang="sh">ìzvor</strong> <span class="gender"><abbr title="muški rod">m</abbr></span> (<i>ćirilica</i> <b><span lang="sh" class="Cyrl"><a href="/w/index.php?title=%D0%B8%D0%B7%D0%B2%D0%BE%D1%80&action=edit&redlink=1" class="new" title="извор (stranica ne postoji)">ѝзвор</a></span></b>)
|
||||
</p>
|
||||
<p style="margin-bottom: -0.5em; cursor: help;" title="Smisao ili semantičko objašnjenje"><b>Značenja:</b>
|
||||
</p><ol><li><i>(značenje izvedeno preko sinonima)</i> <a href="/wiki/izdan" title="izdan">izdan</a>, <a href="/wiki/studenac" title="studenac">studenac</a>, <a href="/wiki/kladenac" title="kladenac">kladenac</a>, <a href="/wiki/zdenac" title="zdenac">zdenac</a>, <a href="/wiki/izvori%C5%A1te" title="izvorište">izvorište</a>, <a href="/wiki/vrelo" title="vrelo">vrelo</a>, <a href="/wiki/isto%C4%8Dnik" title="istočnik">istočnik</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Figurativne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Figurativne reči (stranica ne postoji)">fig.</a></i> <a href="/wiki/uzrok" title="uzrok">uzrok</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Regionalizmi&action=edit&redlink=1" class="new" title="Vikirečnik:Regionalizmi (stranica ne postoji)">reg.</a></i> <a href="/wiki/vir" title="vir">vir</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/wiki/buk" title="buk">buk</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/wiki/ubao" title="ubao">ubao</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Retke_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Retke reči (stranica ne postoji)">ret.</a></i> <a href="/wiki/bunar" title="bunar">bunar</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/vrutak" title="vrutak">vrutak</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/klju%C4%8D" title="ključ">ključ</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/vodnjak" title="vodnjak">vodnjak</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/oko" title="oko">oko</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/slanac" title="slanac">slanac</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/slatina" title="slatina">slatina</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/toplice" title="toplice">toplice</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/w/index.php?title=slana%C4%8D&action=edit&redlink=1" class="new" title="slanač (stranica ne postoji)">slanač</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=slana%C4%8Da&action=edit&redlink=1" class="new" title="slanača (stranica ne postoji)">slanača</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/vru%C4%87ica" title="vrućica">vrućica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=terma&action=edit&redlink=1" class="new" title="terma (stranica ne postoji)">terma</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/slanica" title="slanica">slanica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=toplica&action=edit&redlink=1" class="new" title="toplica (stranica ne postoji)">toplica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-0" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li>
|
||||
<li><i>(značenje izvedeno preko sinonima)</i> <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Figurativne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Figurativne reči (stranica ne postoji)">fig.</a></i> <a href="/wiki/polazi%C5%A1te" title="polazište">polazište</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/osnova" title="osnova">osnova</a>, <a href="/wiki/temelj" title="temelj">temelj</a>, <a href="/wiki/za%C4%8Detak" title="začetak">začetak</a>, <a href="/wiki/po%C4%8Detak" title="početak">početak</a>, <a href="/wiki/platforma" title="platforma">platforma</a>, <a href="/wiki/uzrok" title="uzrok">uzrok</a>, <a href="/wiki/praizvor" title="praizvor">praizvor</a>, <a href="/wiki/pozadina" title="pozadina">pozadina</a>, <a href="/w/index.php?title=prauzrok&action=edit&redlink=1" class="new" title="prauzrok (stranica ne postoji)">prauzrok</a>, <a href="/wiki/polaznica" title="polaznica">polaznica</a>, <a href="/wiki/sto%C5%BEer" title="stožer">stožer</a>, <a href="/wiki/matica" title="matica">matica</a>, <a href="/wiki/izvori%C5%A1te" title="izvorište">izvorište</a>, <a href="/wiki/osnovica" title="osnovica">osnovica</a>, <a href="/wiki/poreklo" title="poreklo">poreklo</a>, <a href="/wiki/podloga" title="podloga">podloga</a>, <a href="/wiki/ishodi%C5%A1te" title="ishodište">ishodište</a>, <a href="/wiki/po%C4%8Delo" title="počelo">počelo</a>, <a href="/w/index.php?title=praelement&action=edit&redlink=1" class="new" title="praelement (stranica ne postoji)">praelement</a>, <a href="/w/index.php?title=nulta_ta%C4%8Dka&action=edit&redlink=1" class="new" title="nulta tačka (stranica ne postoji)">nulta tačka</a>, <a href="/w/index.php?title=pramaterija&action=edit&redlink=1" class="new" title="pramaterija (stranica ne postoji)">pramaterija</a>, <a href="/w/index.php?title=po%C4%8Detna_ta%C4%8Dka&action=edit&redlink=1" class="new" title="početna tačka (stranica ne postoji)">početna tačka</a>, <a href="/wiki/prapo%C4%8Detak" title="prapočetak">prapočetak</a>, <a href="/wiki/leglo" title="leglo">leglo</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/kolevka" title="kolevka">kolevka</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/zametak" title="zametak">zametak</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/koren" title="koren">koren</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/vrelo" title="vrelo">vrelo</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/klica" title="klica">klica</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/seme" title="seme">seme</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/praskozorje" title="praskozorje">praskozorje</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/%C5%BEari%C5%A1te" title="žarište">žarište</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Re%C4%8Di_iz_hrvatskog_standarda&action=edit&redlink=1" class="new" title="Vikirečnik:Reči iz hrvatskog standarda (stranica ne postoji)">hrv.</a></i> <a href="/wiki/podrijetlo" title="podrijetlo">podrijetlo</a> <a href="/w/index.php?title=hrv.&action=edit&redlink=1" class="new" title="hrv. (stranica ne postoji)">hrv.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-1" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li>
|
||||
<li><i>(značenje izvedeno preko sinonima)</i> <a href="/wiki/materija" title="materija">materija</a>, <a href="/wiki/gra%C4%91a" title="građa">građa</a>, <a href="/wiki/rukopis" title="rukopis">rukopis</a>, <a href="/wiki/dokumentacija" title="dokumentacija">dokumentacija</a>, <a href="/wiki/materijal" title="materijal">materijal</a>, <a href="/wiki/literatura" title="literatura">literatura</a>, <a href="/wiki/korpus" title="korpus">korpus</a>, <a href="/wiki/dokument" title="dokument">dokument</a>, <a href="/wiki/gradivo" title="gradivo">gradivo</a>, <a href="/wiki/podaci" title="podaci">podaci</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Familijarne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Familijarne reči (stranica ne postoji)">fam.</a></i> <a href="/wiki/%C5%A1tof" title="štof">štof</a> <a href="/w/index.php?title=fam.&action=edit&redlink=1" class="new" title="fam. (stranica ne postoji)">fam.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Retke_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Retke reči (stranica ne postoji)">ret.</a></i> <a href="/wiki/tvorivo" title="tvorivo">tvorivo</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-2" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li></ol>
|
||||
|
||||
|
||||
<p style="margin-bottom: -0.5em; cursor:help;" title="Reči koje se u određenom kontekstu ravnopravno koriste ili mogu koristiti."><b>Sinonimi:</b>
|
||||
</p><ol><li><a href="/wiki/izdan" title="izdan">izdan</a>, <a href="/wiki/studenac" title="studenac">studenac</a>, <a href="/wiki/kladenac" title="kladenac">kladenac</a>, <a href="/wiki/zdenac" title="zdenac">zdenac</a>, <a href="/wiki/izvori%C5%A1te" title="izvorište">izvorište</a>, <a href="/wiki/vrelo" title="vrelo">vrelo</a>, <a href="/wiki/isto%C4%8Dnik" title="istočnik">istočnik</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Figurativne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Figurativne reči (stranica ne postoji)">fig.</a></i> <a href="/wiki/uzrok" title="uzrok">uzrok</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Regionalizmi&action=edit&redlink=1" class="new" title="Vikirečnik:Regionalizmi (stranica ne postoji)">reg.</a></i> <a href="/wiki/vir" title="vir">vir</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/wiki/buk" title="buk">buk</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/wiki/ubao" title="ubao">ubao</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Retke_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Retke reči (stranica ne postoji)">ret.</a></i> <a href="/wiki/bunar" title="bunar">bunar</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/vrutak" title="vrutak">vrutak</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/klju%C4%8D" title="ključ">ključ</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/vodnjak" title="vodnjak">vodnjak</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/oko" title="oko">oko</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a>, <a href="/wiki/slanac" title="slanac">slanac</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/slatina" title="slatina">slatina</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/toplice" title="toplice">toplice</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/w/index.php?title=slana%C4%8D&action=edit&redlink=1" class="new" title="slanač (stranica ne postoji)">slanač</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=slana%C4%8Da&action=edit&redlink=1" class="new" title="slanača (stranica ne postoji)">slanača</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/vru%C4%87ica" title="vrućica">vrućica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=terma&action=edit&redlink=1" class="new" title="terma (stranica ne postoji)">terma</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a>, <a href="/wiki/slanica" title="slanica">slanica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <a href="/w/index.php?title=reg.&action=edit&redlink=1" class="new" title="reg. (stranica ne postoji)">reg.</a>, <a href="/w/index.php?title=toplica&action=edit&redlink=1" class="new" title="toplica (stranica ne postoji)">toplica</a> <a href="/wiki/su%C5%BE." title="suž.">suž.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-3" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li>
|
||||
<li><i><a href="/w/index.php?title=Vikire%C4%8Dnik:Figurativne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Figurativne reči (stranica ne postoji)">fig.</a></i> <a href="/wiki/polazi%C5%A1te" title="polazište">polazište</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/osnova" title="osnova">osnova</a>, <a href="/wiki/temelj" title="temelj">temelj</a>, <a href="/wiki/za%C4%8Detak" title="začetak">začetak</a>, <a href="/wiki/po%C4%8Detak" title="početak">početak</a>, <a href="/wiki/platforma" title="platforma">platforma</a>, <a href="/wiki/uzrok" title="uzrok">uzrok</a>, <a href="/wiki/praizvor" title="praizvor">praizvor</a>, <a href="/wiki/pozadina" title="pozadina">pozadina</a>, <a href="/w/index.php?title=prauzrok&action=edit&redlink=1" class="new" title="prauzrok (stranica ne postoji)">prauzrok</a>, <a href="/wiki/polaznica" title="polaznica">polaznica</a>, <a href="/wiki/sto%C5%BEer" title="stožer">stožer</a>, <a href="/wiki/matica" title="matica">matica</a>, <a href="/wiki/izvori%C5%A1te" title="izvorište">izvorište</a>, <a href="/wiki/osnovica" title="osnovica">osnovica</a>, <a href="/wiki/poreklo" title="poreklo">poreklo</a>, <a href="/wiki/podloga" title="podloga">podloga</a>, <a href="/wiki/ishodi%C5%A1te" title="ishodište">ishodište</a>, <a href="/wiki/po%C4%8Delo" title="počelo">počelo</a>, <a href="/w/index.php?title=praelement&action=edit&redlink=1" class="new" title="praelement (stranica ne postoji)">praelement</a>, <a href="/w/index.php?title=nulta_ta%C4%8Dka&action=edit&redlink=1" class="new" title="nulta tačka (stranica ne postoji)">nulta tačka</a>, <a href="/w/index.php?title=pramaterija&action=edit&redlink=1" class="new" title="pramaterija (stranica ne postoji)">pramaterija</a>, <a href="/w/index.php?title=po%C4%8Detna_ta%C4%8Dka&action=edit&redlink=1" class="new" title="početna tačka (stranica ne postoji)">početna tačka</a>, <a href="/wiki/prapo%C4%8Detak" title="prapočetak">prapočetak</a>, <a href="/wiki/leglo" title="leglo">leglo</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/kolevka" title="kolevka">kolevka</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/zametak" title="zametak">zametak</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/koren" title="koren">koren</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/vrelo" title="vrelo">vrelo</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/klica" title="klica">klica</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/seme" title="seme">seme</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/praskozorje" title="praskozorje">praskozorje</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <a href="/wiki/%C5%BEari%C5%A1te" title="žarište">žarište</a> <a href="/w/index.php?title=fig.&action=edit&redlink=1" class="new" title="fig. (stranica ne postoji)">fig.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Re%C4%8Di_iz_hrvatskog_standarda&action=edit&redlink=1" class="new" title="Vikirečnik:Reči iz hrvatskog standarda (stranica ne postoji)">hrv.</a></i> <a href="/wiki/podrijetlo" title="podrijetlo">podrijetlo</a> <a href="/w/index.php?title=hrv.&action=edit&redlink=1" class="new" title="hrv. (stranica ne postoji)">hrv.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-4" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li>
|
||||
<li><a href="/wiki/materija" title="materija">materija</a>, <a href="/wiki/gra%C4%91a" title="građa">građa</a>, <a href="/wiki/rukopis" title="rukopis">rukopis</a>, <a href="/wiki/dokumentacija" title="dokumentacija">dokumentacija</a>, <a href="/wiki/materijal" title="materijal">materijal</a>, <a href="/wiki/literatura" title="literatura">literatura</a>, <a href="/wiki/korpus" title="korpus">korpus</a>, <a href="/wiki/dokument" title="dokument">dokument</a>, <a href="/wiki/gradivo" title="gradivo">gradivo</a>, <a href="/wiki/podaci" title="podaci">podaci</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Familijarne_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Familijarne reči (stranica ne postoji)">fam.</a></i> <a href="/wiki/%C5%A1tof" title="štof">štof</a> <a href="/w/index.php?title=fam.&action=edit&redlink=1" class="new" title="fam. (stranica ne postoji)">fam.</a>, <i><a href="/w/index.php?title=Vikire%C4%8Dnik:Retke_re%C4%8Di&action=edit&redlink=1" class="new" title="Vikirečnik:Retke reči (stranica ne postoji)">ret.</a></i> <a href="/wiki/tvorivo" title="tvorivo">tvorivo</a> <a href="/w/index.php?title=ret.&action=edit&redlink=1" class="new" title="ret. (stranica ne postoji)">ret.</a> <sup id="cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-5" class="reference"><a href="#cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1">[1]</a></sup></li></ol>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<h4><span class="mw-headline" id="Deklinacija">Deklinacija</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=izvor&action=edit&section=4" title="Uredi odjeljak Deklinacija">uredi</a><span class="mw-editsection-bracket">]</span></span></h4>
|
||||
<div class="NavFrame" style="width:30em">
|
||||
<div class="NavHead" style="background:#eff7ff">    deklinacija imenice <i>izvor</i></div>
|
||||
<div class="NavContent">
|
||||
<table style="background:#F9F9F9;text-align:center;width:30em" class="inflection-table">
|
||||
|
||||
<tbody><tr>
|
||||
<th style="background:#d9ebff">
|
||||
</th>
|
||||
<th style="background:#d9ebff">jednina
|
||||
</th>
|
||||
<th style="background:#d9ebff">množina
|
||||
</th></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>nominativ</b>
|
||||
</td>
|
||||
<td>izvor
|
||||
</td>
|
||||
<td>izvori
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>genitiv</b>
|
||||
</td>
|
||||
<td>izvora
|
||||
</td>
|
||||
<td>izvora
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>dativ</b>
|
||||
</td>
|
||||
<td>izvoru
|
||||
</td>
|
||||
<td>izvorima
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>akuzativ</b>
|
||||
</td>
|
||||
<td>izvor
|
||||
</td>
|
||||
<td>izvore
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>vokativ</b>
|
||||
</td>
|
||||
<td>izvore
|
||||
</td>
|
||||
<td>izvori
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>lokativ</b>
|
||||
</td>
|
||||
<td>izvoru
|
||||
</td>
|
||||
<td>izvorima
|
||||
</td></tr>
|
||||
<tr>
|
||||
<td style="background-color:#eff7ff;"><b>instrumental</b>
|
||||
</td>
|
||||
<td>izvorom
|
||||
</td>
|
||||
<td>izvorima
|
||||
</td></tr></tbody></table></div></div>
|
||||
<h3><span class="mw-headline" id="Reference">Reference</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=izvor&action=edit&section=5" title="Uredi odjeljak Reference">uredi</a><span class="mw-editsection-bracket">]</span></span></h3>
|
||||
<ul><li>„<span class="plainlinks"><a rel="nofollow" class="external text" href="http://hjp.znanje.hr/index.php?show=search_by_id&id=fVdiWxU%3D">izvor</a></span>” u <i>Hrvatskom jezičnom portalu</i></li></ul>
|
||||
<div class="mw-references-wrap"><ol class="references">
|
||||
<li id="cite_note-P._Ćosić_i_saradnici,_Rečnik_sinonima-1"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-0">1,0</a></sup> <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-1">1,1</a></sup> <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-2">1,2</a></sup> <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-3">1,3</a></sup> <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-4">1,4</a></sup> <sup><a href="#cite_ref-P._Ćosić_i_saradnici,_Rečnik_sinonima_1-5">1,5</a></sup></span> <span class="reference-text">Pavle Ćosić i saradnici, Rečnik sinonima, Beograd 2008, <a href="/wiki/Posebno:Tra%C5%BEi_ISBN/9788686673091" class="internal mw-magiclink-isbn">ISBN 978-86-86673-09-1</a></span>
|
||||
</li>
|
||||
</ol></div>
|
||||
<!--
|
||||
NewPP limit report
|
||||
Parsed by mw1359
|
||||
Cached time: 20220916223128
|
||||
Cache expiry: 1814400
|
||||
Reduced expiry: false
|
||||
Complications: [show‐toc]
|
||||
CPU time usage: 0.194 seconds
|
||||
Real time usage: 0.220 seconds
|
||||
Preprocessor visited node count: 446/1000000
|
||||
Post‐expand include size: 8118/2097152 bytes
|
||||
Template argument size: 5300/2097152 bytes
|
||||
Highest expansion depth: 6/100
|
||||
Expensive parser function count: 1/500
|
||||
Unstrip recursion depth: 0/20
|
||||
Unstrip post‐expand size: 1002/5000000 bytes
|
||||
Lua time usage: 0.099/10.000 seconds
|
||||
Lua memory usage: 7580626/52428800 bytes
|
||||
Number of Wikibase entities loaded: 0/400
|
||||
-->
|
||||
<!--
|
||||
Transclusion expansion time report (%,ms,calls,template)
|
||||
100.00% 163.404 1 -total
|
||||
68.90% 112.579 1 Šablon:IPA
|
||||
13.44% 21.965 1 Šablon:sh-imenica2
|
||||
8.32% 13.599 1 Šablon:l
|
||||
5.39% 8.815 1 Šablon:Značenje
|
||||
4.79% 7.834 1 Šablon:rastav
|
||||
4.43% 7.244 1 Šablon:sh-imenica-deklinacija2
|
||||
4.27% 6.974 3 Šablon:značenje_preko_sinonima
|
||||
1.89% 3.096 1 Šablon:Latn
|
||||
1.82% 2.979 1 Šablon:Sinonimi
|
||||
-->
|
||||
|
||||
<!-- Saved in parser cache with key shwiktionary:pcache:idhash:40700-0!canonical and timestamp 20220916223128 and revision id 1460287.
|
||||
-->
|
||||
</div><noscript><img src="//sh.wiktionary.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;" /></noscript>
|
||||
<div class="printfooter" data-nosnippet="">Izvor: <a dir="ltr" href="https://sh.wiktionary.org/w/index.php?title=izvor&oldid=1460287">https://sh.wiktionary.org/w/index.php?title=izvor&oldid=1460287</a></div></div>
|
||||
<div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Posebno:Kategorije" title="Posebno:Kategorije">Kategorije</a>: <ul><li><a href="/wiki/Kategorija:Srpskohrvatske_imenice" title="Kategorija:Srpskohrvatske imenice">Srpskohrvatske imenice</a></li><li><a href="/wiki/Kategorija:Srpskohrvatske_imenice_mu%C5%A1kog_roda" title="Kategorija:Srpskohrvatske imenice muškog roda">Srpskohrvatske imenice muškog roda</a></li><li><a href="/wiki/Kategorija:Srpskohrvatski_indeks" title="Kategorija:Srpskohrvatski indeks">Srpskohrvatski indeks</a></li><li><a href="/w/index.php?title=Kategorija:Stranice_sa_%C4%8Darobnim_vezama_za_ISBN&action=edit&redlink=1" class="new" title="Kategorija:Stranice sa čarobnim vezama za ISBN (stranica ne postoji)">Stranice sa čarobnim vezama za ISBN</a></li></ul></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="mw-navigation">
|
||||
<h2>Navigacijski meni</h2>
|
||||
<div id="mw-head">
|
||||
|
||||
|
||||
<nav id="p-personal" class="vector-menu mw-portlet mw-portlet-personal vector-user-menu-legacy" aria-labelledby="p-personal-label" role="navigation" >
|
||||
<h3
|
||||
id="p-personal-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Lični alati</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="pt-anonuserpage" class="mw-list-item"><span title="Korisnička stranica za ip koju Vi uređujete kao">Niste prijavljeni</span></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Posebno:Moj_razgovor" title="Rasprava o izmjenama s ove IP adrese [n]" accesskey="n"><span>Razgovor</span></a></li><li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Posebno:Moji_doprinosi" title="Lista uređenja napravljenih s ove IP adrese [y]" accesskey="y"><span>Doprinosi</span></a></li><li id="pt-createaccount" class="mw-list-item"><a href="/w/index.php?title=Posebno:Stvori_ra%C4%8Dun&returnto=izvor" title="Predlažemo vam da izradite račun i prijavite se, iako to nije obavezno"><span>Napravi račun</span></a></li><li id="pt-login" class="mw-list-item"><a href="/w/index.php?title=Posebno:Korisni%C4%8Dka_prijava&returnto=izvor" title="Predlažem da se prijavite; međutim, to nije obavezno [o]" accesskey="o"><span>Prijavi me</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="left-navigation">
|
||||
|
||||
|
||||
<nav id="p-namespaces" class="vector-menu mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy" aria-labelledby="p-namespaces-label" role="navigation" >
|
||||
<h3
|
||||
id="p-namespaces-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Imenski prostori</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="ca-nstab-main" class="selected mw-list-item"><a href="/wiki/izvor" title="Vidi stranicu sadržaja [c]" accesskey="c"><span>Stranica</span></a></li><li id="ca-talk" class="new mw-list-item"><a href="/w/index.php?title=Razgovor:izvor&action=edit&redlink=1" rel="discussion" title="Diskusija o stranici sadržaja (stranica ne postoji) [t]" accesskey="t"><span>Razgovor</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<nav id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown" aria-labelledby="p-variants-label" role="navigation" >
|
||||
<input type="checkbox"
|
||||
id="p-variants-checkbox"
|
||||
role="button"
|
||||
aria-haspopup="true"
|
||||
data-event-name="ui.dropdown-p-variants"
|
||||
class="vector-menu-checkbox"
|
||||
aria-labelledby="p-variants-label"
|
||||
/>
|
||||
<label
|
||||
id="p-variants-label"
|
||||
aria-label="Promijeni jezičnu varijantu"
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">srpskohrvatski / српскохрватски</span>
|
||||
</label>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
<div id="right-navigation">
|
||||
|
||||
|
||||
<nav id="p-views" class="vector-menu mw-portlet mw-portlet-views vector-menu-tabs vector-menu-tabs-legacy" aria-labelledby="p-views-label" role="navigation" >
|
||||
<h3
|
||||
id="p-views-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Pregledi</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/izvor"><span>Čitaj</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=izvor&action=edit" title="Uredite ovu stranicu [e]" accesskey="e"><span>Uredi</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=izvor&action=history" title="Prethodne izmjene ove stranice [h]" accesskey="h"><span>Historija/Историја</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<nav id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown" aria-labelledby="p-cactions-label" role="navigation" title="Više mogućnosti" >
|
||||
<input type="checkbox"
|
||||
id="p-cactions-checkbox"
|
||||
role="button"
|
||||
aria-haspopup="true"
|
||||
data-event-name="ui.dropdown-p-cactions"
|
||||
class="vector-menu-checkbox"
|
||||
aria-labelledby="p-cactions-label"
|
||||
/>
|
||||
<label
|
||||
id="p-cactions-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Više</span>
|
||||
</label>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<div id="p-search" role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box">
|
||||
<div>
|
||||
<h3 >
|
||||
<label for="searchInput">Pretraga</label>
|
||||
</h3>
|
||||
<form action="/w/index.php" id="searchform"
|
||||
class="vector-search-box-form">
|
||||
<div id="simpleSearch"
|
||||
class="vector-search-box-inner"
|
||||
data-search-loc="header-navigation">
|
||||
<input class="vector-search-box-input"
|
||||
type="search" name="search" placeholder="Pretraži Wiktionary" aria-label="Pretraži Wiktionary" autocapitalize="none" title="Pretraži projekt Wiktionary [f]" accesskey="f" id="searchInput"
|
||||
>
|
||||
<input type="hidden" name="title" value="Posebno:Traži">
|
||||
<input id="mw-searchButton"
|
||||
class="searchButton mw-fallbackSearchButton" type="submit" name="fulltext" title="Pretraga stranica sa ovim tekstom" value="Pretraži">
|
||||
<input id="searchButton"
|
||||
class="searchButton" type="submit" name="go" title="Idi na stranicu s upravo ovakvim imenom ako postoji" value="Idi">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="mw-panel">
|
||||
<div id="p-logo" role="banner">
|
||||
<a class="mw-wiki-logo" href="/wiki/Glavna_stranica"
|
||||
title="Posjeti glavnu stranicu"></a>
|
||||
</div>
|
||||
|
||||
|
||||
<nav id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation vector-menu-portal portal" aria-labelledby="p-navigation-label" role="navigation" >
|
||||
<h3
|
||||
id="p-navigation-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Navigacija</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="n-Početna-strana/Почетна-страна" class="mw-list-item"><a href="/wiki/Glavna_strana"><span>Početna strana/Почетна страна</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Posebno:Nedavne_izmjene" title="Spisak nedavnih izmjena na wikiju. [r]" accesskey="r"><span>Nedavne izmjene</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Posebno:Slu%C4%8Dajna_stranica" title="Otvorite slučajnu stranicu [x]" accesskey="x"><span>Nasumična stranica</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<nav id="p-interakcija_-_интеракција" class="vector-menu mw-portlet mw-portlet-interakcija_-_интеракција vector-menu-portal portal" aria-labelledby="p-interakcija_-_интеракција-label" role="navigation" >
|
||||
<h3
|
||||
id="p-interakcija_-_интеракција-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">interakcija - интеракција</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="n-Pomoć/Помоћ" class="mw-list-item"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents"><span>Pomoć/Помоћ</span></a></li><li id="n-Pijaca/Пијаца" class="mw-list-item"><a href="/wiki/Wiktionary:Pijaca-%D0%9F%D0%B8%D1%98%D0%B0%D1%86%D0%B0"><span>Pijaca/Пијаца</span></a></li><li id="n-Portal-zajednice/Портал-заједнице" class="mw-list-item"><a href="/wiki/Wiktionary:Portal_zajednice"><span>Portal zajednice/Портал заједнице</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<nav id="p-tb" class="vector-menu mw-portlet mw-portlet-tb vector-menu-portal portal" aria-labelledby="p-tb-label" role="navigation" >
|
||||
<h3
|
||||
id="p-tb-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Alati</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Posebno:%C5%A0to_vodi_ovdje/izvor" title="Lista svih wiki stranica koje upućuju ovamo [j]" accesskey="j"><span>Šta vodi dovde</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Posebno:Povezane_izmjene/izvor" rel="nofollow" title="Nedavne izmjene na stranicama koje su povezane s ovom stranicom [k]" accesskey="k"><span>Povezane izmjene</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=sh" title="Postavi datoteke [u]" accesskey="u"><span>Postavi datoteku</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Posebno:Posebne_stranice" title="Lista svih posebnih stranica [q]" accesskey="q"><span>Posebne stranice</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=izvor&oldid=1460287" title="Trajni link ove verzije stranice"><span>Trajni link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=izvor&action=info" title="Više informacija o ovoj stranici"><span>Podaci o stranici</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Posebno:Citiraj&page=izvor&id=1460287&wpFormIdentifier=titleform" title="Informacije kako citirati ovu stranicu"><span>Citiraj ovu stranicu</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
<nav id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export vector-menu-portal portal" aria-labelledby="p-coll-print_export-label" role="navigation" >
|
||||
<h3
|
||||
id="p-coll-print_export-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Štampanje/izvoz</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Posebno:Kolekcija&bookcmd=book_creator&referer=izvor"><span>Napravi knjigu</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Posebno:DownloadAsPdf&page=izvor&action=show-download-screen"><span>Preuzmi kao PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=izvor&printable=yes" title="Verzija ove stranice za ispis [p]" accesskey="p"><span>Verzija za ispis</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<nav id="p-lang" class="vector-menu mw-portlet mw-portlet-lang vector-menu-portal portal" aria-labelledby="p-lang-label" role="navigation" >
|
||||
<h3
|
||||
id="p-lang-label"
|
||||
|
||||
class="vector-menu-heading "
|
||||
>
|
||||
<span class="vector-menu-heading-label">Na drugim jezicima</span>
|
||||
</h3>
|
||||
<div class="vector-menu-content">
|
||||
|
||||
<ul class="vector-menu-content-list"><li class="interlanguage-link interwiki-chr mw-list-item"><a href="https://chr.wiktionary.org/wiki/izvor" title="izvor — Čeroki" lang="chr" hreflang="chr" class="interlanguage-link-target"><span>ᏣᎳᎩ</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wiktionary.org/wiki/izvor" title="izvor — Engleski" lang="en" hreflang="en" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wiktionary.org/wiki/izvor" title="izvor — Finski" lang="fi" hreflang="fi" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wiktionary.org/wiki/izvor" title="izvor — Francuski" lang="fr" hreflang="fr" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-hr mw-list-item"><a href="https://hr.wiktionary.org/wiki/izvor" title="izvor — Hrvatski" lang="hr" hreflang="hr" class="interlanguage-link-target"><span>Hrvatski</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wiktionary.org/wiki/izvor" title="izvor — Mađarski" lang="hu" hreflang="hu" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-io mw-list-item"><a href="https://io.wiktionary.org/wiki/izvor" title="izvor — Ido" lang="io" hreflang="io" class="interlanguage-link-target"><span>Ido</span></a></li><li class="interlanguage-link interwiki-ku mw-list-item"><a href="https://ku.wiktionary.org/wiki/izvor" title="izvor — Kurdski" lang="ku" hreflang="ku" class="interlanguage-link-target"><span>Kurdî</span></a></li><li class="interlanguage-link interwiki-mg mw-list-item"><a href="https://mg.wiktionary.org/wiki/izvor" title="izvor — Malagazijski" lang="mg" hreflang="mg" class="interlanguage-link-target"><span>Malagasy</span></a></li><li class="interlanguage-link interwiki-mk mw-list-item"><a href="https://mk.wiktionary.org/wiki/izvor" title="izvor — Makedonski" lang="mk" hreflang="mk" class="interlanguage-link-target"><span>Македонски</span></a></li><li class="interlanguage-link interwiki-pl mw-list-item"><a href="https://pl.wiktionary.org/wiki/izvor" title="izvor — Poljski" lang="pl" hreflang="pl" class="interlanguage-link-target"><span>Polski</span></a></li><li class="interlanguage-link interwiki-ro mw-list-item"><a href="https://ro.wiktionary.org/wiki/izvor" title="izvor — Rumunski" lang="ro" hreflang="ro" class="interlanguage-link-target"><span>Română</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wiktionary.org/wiki/izvor" title="izvor — Ruski" lang="ru" hreflang="ru" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-sl mw-list-item"><a href="https://sl.wiktionary.org/wiki/izvor" title="izvor — Slovenački" lang="sl" hreflang="sl" class="interlanguage-link-target"><span>Slovenščina</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wiktionary.org/wiki/izvor" title="izvor — Srpski" lang="sr" hreflang="sr" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wiktionary.org/wiki/izvor" title="izvor — Ukrajinski" lang="uk" hreflang="uk" class="interlanguage-link-target"><span>Українська</span></a></li></ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<footer id="footer" class="mw-footer" role="contentinfo" >
|
||||
<ul id="footer-info">
|
||||
<li id="footer-info-lastmod"> Datum i vrijeme posljednje izmjene stranice: 10 februar 2017 u 03:22</li>
|
||||
<li id="footer-info-copyright">Tekst je dostupan pod licencom <a href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike</a>;
|
||||
mogu se primijeniti i dodatni uslovi.
|
||||
Više informacija možete naći u <a href="https://foundation.wikimedia.org/wiki/Terms_of_Use">Uslovima upotrebe</a>.</li>
|
||||
</ul>
|
||||
|
||||
<ul id="footer-places">
|
||||
<li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Privacy_policy">Pravila o privatnosti</a></li>
|
||||
<li id="footer-places-about"><a href="/wiki/Wiktionary:O_projektu">O projektu</a></li>
|
||||
<li id="footer-places-disclaimer"><a href="/wiki/Wiktionary:Op%C4%87e_odricanje_odgovornosti">Odricanje odgovornosti</a></li>
|
||||
<li id="footer-places-mobileview"><a href="//sh.m.wiktionary.org/w/index.php?title=izvor&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobilni prikaz</a></li>
|
||||
<li id="footer-places-developers"><a href="https://developer.wikimedia.org">Programeri</a></li>
|
||||
<li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/sh.wiktionary.org">Statistika</a></li>
|
||||
<li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Cookie_statement">Izjava o kolačićima</a></li>
|
||||
</ul>
|
||||
|
||||
<ul id="footer-icons" class="noprint">
|
||||
<li id="footer-copyrightico"><a href="https://wikimediafoundation.org/"><img src="/static/images/footer/wikimedia-button.png" srcset="/static/images/footer/wikimedia-button-1.5x.png 1.5x, /static/images/footer/wikimedia-button-2x.png 2x" width="88" height="31" alt="Wikimedia Foundation" loading="lazy" /></a></li>
|
||||
<li id="footer-poweredbyico"><a href="https://www.mediawiki.org/"><img src="/static/images/footer/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" srcset="/static/images/footer/poweredby_mediawiki_132x47.png 1.5x, /static/images/footer/poweredby_mediawiki_176x62.png 2x" width="88" height="31" loading="lazy"/></a></li>
|
||||
</ul>
|
||||
|
||||
</footer>
|
||||
|
||||
<script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"0.194","walltime":"0.220","ppvisitednodes":{"value":446,"limit":1000000},"postexpandincludesize":{"value":8118,"limit":2097152},"templateargumentsize":{"value":5300,"limit":2097152},"expansiondepth":{"value":6,"limit":100},"expensivefunctioncount":{"value":1,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":1002,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 163.404 1 -total"," 68.90% 112.579 1 Šablon:IPA"," 13.44% 21.965 1 Šablon:sh-imenica2"," 8.32% 13.599 1 Šablon:l"," 5.39% 8.815 1 Šablon:Značenje"," 4.79% 7.834 1 Šablon:rastav"," 4.43% 7.244 1 Šablon:sh-imenica-deklinacija2"," 4.27% 6.974 3 Šablon:značenje_preko_sinonima"," 1.89% 3.096 1 Šablon:Latn"," 1.82% 2.979 1 Šablon:Sinonimi"]},"scribunto":{"limitreport-timeusage":{"value":"0.099","limit":"10.000"},"limitreport-memusage":{"value":7580626,"limit":52428800}},"cachereport":{"origin":"mw1359","timestamp":"20220916223128","ttl":1814400,"transientcontent":false}}});mw.config.set({"wgBackendResponseTime":76,"wgHostname":"mw1415"});});</script>
|
||||
</body>
|
||||
</html>
|
||||
3
src/croatian/wiktionary/notes.txt
Normal file
3
src/croatian/wiktionary/notes.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
https://github.com/tatuylonen/wiktextract
|
||||
|
||||
https://kaikki.org/dictionary/rawdata.html
|
||||
30
src/croatian/wiktionary/smart-results.txt
Normal file
30
src/croatian/wiktionary/smart-results.txt
Normal file
@@ -0,0 +1,30 @@
|
||||
gf -run MorphoDictHrv.gf <test-smart.gfs
|
||||
mv *.tmp full/
|
||||
gf -run MorphoDictHrvSmart.gf <test-smart.gfs
|
||||
mv *.tmp smart/
|
||||
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/N-list.tmp smart/N-list.tmp | wc
|
||||
10509 147652 1331546
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/N-list.tmp smart/N-list.tmp | grep "|" | wc
|
||||
5877 86924 749699
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/N-table.tmp smart/N-table.tmp | grep "|" | wc
|
||||
22354 156623 994255
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/N-table.tmp smart/N-table.tmp | wc
|
||||
105080 652941 4161921
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/A-table.tmp smart/A-table.tmp | wc
|
||||
50760 416532 3014404
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/A-table.tmp smart/A-table.tmp | grep "|" | wc
|
||||
10452 94068 648853
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/V-table.tmp smart/V-table.tmp | wc
|
||||
69555 896719 5053646
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/V-table.tmp smart/V-table.tmp | grep "|" | wc
|
||||
44589 607381 3485218
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/A-list.tmp smart/A-list.tmp | grep "|" | wc
|
||||
1361 16068 173486
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/A-list.tmp smart/A-list.tmp | wc
|
||||
1410 16661 179955
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/V-list.tmp smart/V-list.tmp | wc
|
||||
4632 65408 590028
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$ diff -y full/V-list.tmp smart/V-list.tmp | grep "|" | wc
|
||||
3979 56003 507444
|
||||
Aarnes-MacBook-Pro:wiktionary aarne$
|
||||
9
src/croatian/wiktionary/test-smart.gfs
Normal file
9
src/croatian/wiktionary/test-smart.gfs
Normal file
@@ -0,0 +1,9 @@
|
||||
gt -cat=N | l -list | wf -file=N-list.tmp
|
||||
gt -cat=A | l -list | wf -file=A-list.tmp
|
||||
gt -cat=PN | l -list | wf -file=PN-list.tmp
|
||||
gt -cat=V | l -list | wf -file=V-list.tmp
|
||||
gt -cat=N | l -table | wf -file=N-table.tmp
|
||||
gt -cat=A | l -table | wf -file=A-table.tmp
|
||||
gt -cat=PN | l -table | wf -file=PN-table.tmp
|
||||
gt -cat=V | l -table | wf -file=V-table.tmp
|
||||
|
||||
@@ -81,6 +81,6 @@ concrete CatDut of Cat =
|
||||
N = Noun ;
|
||||
N2 = {s : NForm => Str ; g : Gender} ** {c2 : Preposition} ;
|
||||
N3 = {s : NForm => Str ; g : Gender} ** {c2,c3 : Preposition} ;
|
||||
PN = {s : NPCase => Str} ;
|
||||
GN, SN, PN = {s : NPCase => Str} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -115,4 +115,9 @@ lin
|
||||
isPron = False
|
||||
} ;
|
||||
|
||||
lin GivenName, MaleSurname, FemaleSurname = \n -> n ;
|
||||
lin FullName gn sn = {
|
||||
s = \\c => gn.s ! NPNom ++ sn.s ! c
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ flags optimize = all_subs ;
|
||||
lincat
|
||||
Digit = {s : DForm => CardOrd => Str ; en : Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Str ; n : Number ; en : Str ; attr : Str} ;
|
||||
Sub100, Sub1000, Sub1000000 =
|
||||
Sub100, Sub1000, Sub1000000, Sub1000000000, Sub1000000000000 =
|
||||
{s : CardOrd => Str ; n : Number ; attr : Str} ;
|
||||
|
||||
lin
|
||||
@@ -49,6 +49,8 @@ lin
|
||||
pot3plus n m =
|
||||
addAttr {s = \\g => n.attr ++ "duizend" ++ m.s ! g ; n = Pl} ;
|
||||
|
||||
pot3as4 n = n ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
lincat
|
||||
Dig = TDigit ;
|
||||
|
||||
@@ -106,7 +106,7 @@ concrete CatEng of Cat = CommonX - [Pol,CAdv] ** open ResEng, Prelude in {
|
||||
N = {s : Number => Case => Str ; g : Gender} ;
|
||||
N2 = {s : Number => Case => Str ; g : Gender} ** {c2 : Str} ;
|
||||
N3 = {s : Number => Case => Str ; g : Gender} ** {c2,c3 : Str} ;
|
||||
PN = {s : Case => Str ; g : Gender} ;
|
||||
GN, SN, PN = {s : Case => Str ; g : Gender} ;
|
||||
|
||||
lindef
|
||||
SSlash = \s -> {s = s; c2 = ""} ;
|
||||
|
||||
@@ -38,6 +38,34 @@ lin
|
||||
)
|
||||
} ;
|
||||
|
||||
InflectionGN = \pn -> {
|
||||
t = "gn" ;
|
||||
s1 = heading1 ("Given Name" ++
|
||||
case pn.g of {
|
||||
Neutr => "";
|
||||
Masc => "(masc)";
|
||||
Fem => "(fem)"
|
||||
}) ;
|
||||
s2 = frameTable (
|
||||
tr (th "nom" ++ th "gen") ++
|
||||
tr (td (pn.s ! Nom) ++ td (pn.s ! Gen))
|
||||
)
|
||||
} ;
|
||||
|
||||
InflectionSN = \pn -> {
|
||||
t = "sn" ;
|
||||
s1 = heading1 ("Secondary Name" ++
|
||||
case pn.g of {
|
||||
Neutr => "";
|
||||
Masc => "(masc)";
|
||||
Fem => "(fem)"
|
||||
}) ;
|
||||
s2 = frameTable (
|
||||
tr (th "nom" ++ th "gen") ++
|
||||
tr (td (pn.s ! Nom) ++ td (pn.s ! Gen))
|
||||
)
|
||||
} ;
|
||||
|
||||
InflectionA, InflectionA2 = \adj -> {
|
||||
t = "a" ;
|
||||
s1 = heading1 "Adjective" ;
|
||||
|
||||
@@ -191,13 +191,13 @@ concrete ExtendEng of Extend =
|
||||
inf = verb.adv ++ vp.ad ! a ++ verb.fin ++ verb.inf ++ vp.p ++ compl} ;
|
||||
} ;
|
||||
|
||||
linVPS : Agr -> {s : Order => Agr => {fin,inf : Str}} -> Str = \agr,vps -> let vpss = vps.s ! ODir True ! agr in vpss.fin ++ vpss.inf ;
|
||||
linVPS : Agr -> {s : Order => Agr => {fin,inf : Str}} -> Str = \agr,vps -> let vpss = vps.s ! ODir False ! agr in vpss.fin ++ vpss.inf ;
|
||||
|
||||
mkVPI : VP -> VPI = \vp -> lin VPI {
|
||||
s = table {
|
||||
VVAux => \\a => vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a ;
|
||||
VVInf => \\a => "to" ++ vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a ;
|
||||
VVPresPart => \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a
|
||||
VVAux => \\a => vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a ++ vp.ext ;
|
||||
VVInf => \\a => "to" ++ vp.ad ! a ++ vp.inf ++ vp.p ++ vp.s2 ! a ++ vp.ext ;
|
||||
VVPresPart => \\a => vp.ad ! a ++ vp.prp ++ vp.p ++ vp.s2 ! a ++ vp.ext
|
||||
}
|
||||
} ;
|
||||
|
||||
@@ -471,4 +471,11 @@ lin UseDAPFem dap = {
|
||||
lin CardCNCard card cn =
|
||||
{s,sp = \\d,c => card.s ! d ! Nom ++ cn.s ! card.n ! c ; n = Pl} ;
|
||||
|
||||
lin GivenName gn = gn ;
|
||||
lin MaleSurname, FemaleSurname = \sn -> sn ;
|
||||
lin FullName gn sn = {
|
||||
s = \\c => gn.s ! Nom ++ sn.s ! c ;
|
||||
g = gn.g
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -4,8 +4,10 @@ lincat
|
||||
Digit = {s : DForm => CardOrd => Case => Str} ;
|
||||
Sub10 = {s : DForm => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub100 = {s : CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
Sub1000000000000 = {s : Bool => CardOrd => Case => Str ; n : Number} ;
|
||||
|
||||
lin num x = x ;
|
||||
lin n2 = let two = mkNum "two" "twelve" "twenty" "second" in
|
||||
@@ -25,22 +27,71 @@ lin n9 = mkNum "nine" "nineteen" "ninety" "ninth" ;
|
||||
|
||||
lin pot01 = mkNum "one" "eleven" "ten" "first" ** {n = Sg} ;
|
||||
lin pot0 d = d ** {n = Pl} ;
|
||||
lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
|
||||
|
||||
lin pot110 = regCardOrd "ten" ** {n = Pl} ;
|
||||
lin pot111 = regCardOrd "eleven" ** {n = Pl} ;
|
||||
lin pot1to19 d = {s = d.s ! teen} ** {n = Pl} ;
|
||||
lin pot0as1 n = {s = n.s ! unit} ** {n = n.n} ;
|
||||
lin pot1 d = {s = d.s ! ten} ** {n = Pl} ;
|
||||
lin pot1plus d e = {
|
||||
s = \\o,c => d.s ! ten ! NCard ! Nom ++ BIND ++ "-" ++ BIND ++ e.s ! unit ! o ! c ; n = Pl} ;
|
||||
lin pot1as2 n = {s = \\_ => n.s; n=n.n} ;
|
||||
|
||||
lin pot21 = {
|
||||
s = \\d,o,c => case d of {True => []; False => "a"} ++
|
||||
(regCardOrd "hundred").s ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot2 d = {s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ mkCard o "hundred" ! c} ** {n = Pl} ;
|
||||
lin pot2plus d e = {
|
||||
s = \\_,o,c => d.s ! unit ! NCard ! Nom ++ "hundred" ++ "and" ++ e.s ! o ! c ; n = Pl} ;
|
||||
lin pot2as3 n = n ;
|
||||
|
||||
lin pot31 = {
|
||||
s = \\d,o,c => case d of {True => []; False => "a"} ++
|
||||
(regCardOrd "thousand").s ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot3 n = {
|
||||
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ mkCard o "thousand" ! c ; n = Pl} ;
|
||||
lin pot3plus n m = {
|
||||
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ "thousand" ++ m.s ! False ! o ! c; n = Pl} ;
|
||||
lin pot3as4 n = n ;
|
||||
lin pot3float f = {
|
||||
s = \\d,o,c => f.s ++ mkCard o "thousand" ! c ; n = Pl} ;
|
||||
|
||||
lin pot41 = {
|
||||
s = \\d,o,c => case d of {True => []; False => "a"} ++
|
||||
(regCardOrd "million").s ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4 n = {
|
||||
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ pot41.s ! True ! o ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4plus n1 n2 = {
|
||||
s = \\d,o,c => n1.s ! d ! NCard ! Nom ++ pot41.s ! True ! NCard ! Nom ++ "and" ++ n2.s ! True ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot4as5 n = n ;
|
||||
lin pot4float f = {
|
||||
s = \\d,o,c => f.s ++ pot41.s ! True ! o ! c ; n = Pl} ;
|
||||
|
||||
lin pot51 = {
|
||||
s = \\d,o,c => case d of {True => []; False => "a"} ++
|
||||
(regCardOrd "billion").s ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5 n = {
|
||||
s = \\d,o,c => n.s ! d ! NCard ! Nom ++ pot51.s ! True ! o ! c ;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5plus n1 n2 = {
|
||||
s = \\d,o,c => n1.s ! d ! NCard ! Nom ++ pot51.s ! True ! NCard ! Nom ++ "and" ++ n2.s ! True ! o ! c;
|
||||
n = Pl
|
||||
} ;
|
||||
lin pot5float f = {
|
||||
s = \\d,o,c => f.s ++ pot51.s ! True ! o ! c ; n = Pl} ;
|
||||
|
||||
-- numerals as sequences of digits
|
||||
|
||||
|
||||
@@ -132,6 +132,7 @@ oper
|
||||
mkPN : overload {
|
||||
|
||||
mkPN : Str -> PN ;
|
||||
mkPN : Str -> Gender -> PN ;
|
||||
|
||||
-- Sometimes a common noun can be reused as a proper name, e.g. "Bank"
|
||||
|
||||
@@ -435,6 +436,7 @@ mkVoc s = lin Voc (ss s) ;
|
||||
|
||||
mkPN = overload {
|
||||
mkPN : Str -> PN = regPN ;
|
||||
mkPN : Str -> Gender -> PN = regGenPN ;
|
||||
mkPN : N -> PN = nounPN
|
||||
} ;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
abstract AllEstAbs =
|
||||
Lang,
|
||||
ExtraEstAbs
|
||||
Extend
|
||||
** {} ;
|
||||
|
||||
@@ -13,7 +13,7 @@ concrete CatEst of Cat = CommonX ** open HjkEst, ResEst, Prelude in {
|
||||
|
||||
-- Sentence
|
||||
|
||||
Cl = {s : ResEst.Tense => Anteriority => Polarity => SType => Str} ;
|
||||
Cl = {s : ResEst.Tense => Anteriority => Polarity => Str} ;
|
||||
ClSlash = {s : ResEst.Tense => Anteriority => Polarity => Str ; c2 : Compl} ;
|
||||
Imp = {s : Polarity => Agr => Str} ;
|
||||
|
||||
@@ -22,7 +22,7 @@ concrete CatEst of Cat = CommonX ** open HjkEst, ResEst, Prelude in {
|
||||
QCl = {s : ResEst.Tense => Anteriority => Polarity => Str} ;
|
||||
IP = ResEst.IPhrase ;
|
||||
IComp = {s : Agr => Str} ;
|
||||
IDet = {s : Case => Str ; n : Number ; isNum : Bool} ;
|
||||
IDet = ResEst.IDeterminer ;
|
||||
IQuant = {s : Number => Case => Str} ;
|
||||
|
||||
-- Relative
|
||||
@@ -91,15 +91,15 @@ concrete CatEst of Cat = CommonX ** open HjkEst, ResEst, Prelude in {
|
||||
c2,c3 : Compl ;
|
||||
isPre,isPre2 : Bool
|
||||
} ;
|
||||
PN = {s : Case => Str} ;
|
||||
GN, SN, PN = {s : Case => Str} ;
|
||||
|
||||
linref
|
||||
VP = \vp -> linV vp.v ;
|
||||
NP = linNP (NPCase Nom) ;
|
||||
CN = linCN (NCase Sg Nom) ;
|
||||
V,VS,VQ = linV ;
|
||||
V2,VA,V2S,V2Q = linV2 ;
|
||||
|
||||
V2,VA,V2S,V2Q,V3 = linV2 ;
|
||||
IDet = linIDet ;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,9 @@ concrete ConjunctionEst of Conjunction =
|
||||
|
||||
ConjS = conjunctDistrSS ;
|
||||
|
||||
ConjAdv = conjunctDistrSS ;
|
||||
ConjAdv,
|
||||
ConjAdV,
|
||||
ConjIAdv = conjunctDistrSS ;
|
||||
|
||||
ConjCN conj ss = conjunctDistrTable NForm conj ss ** ss ;
|
||||
|
||||
@@ -27,8 +29,8 @@ concrete ConjunctionEst of Conjunction =
|
||||
|
||||
BaseS = twoSS ;
|
||||
ConsS = consrSS comma ;
|
||||
BaseAdv = twoSS ;
|
||||
ConsAdv = consrSS comma ;
|
||||
BaseAdv, BaseAdV, BaseIAdv = twoSS ;
|
||||
ConsAdv, ConsAdV, ConsIAdv = consrSS comma ;
|
||||
BaseCN x y = twoTable NForm (mergeCN x) y ** {postmod = y.postmod} ;
|
||||
ConsCN x xs = consrTable NForm comma (mergeCN x) xs ** xs ;
|
||||
BaseNP x y = twoTable NPForm (mergeNP x) y ** {a = conjAgr x.a y.a ; postmod = y.postmod} ;
|
||||
@@ -41,26 +43,29 @@ concrete ConjunctionEst of Conjunction =
|
||||
lincat
|
||||
[S] = {s1,s2 : Str} ;
|
||||
[Adv] = {s1,s2 : Str} ;
|
||||
[AdV] = {s1,s2 : Str} ;
|
||||
[IAdv] = {s1,s2 : Str} ;
|
||||
[CN] = {s1,s2 : NForm => Str ; postmod : Str} ;
|
||||
[NP] = {s1,s2 : NPForm => Str ; a : Agr ; postmod : Str} ;
|
||||
[AP] = {s1,s2 : {s : Bool => NForm => Str ; infl : Infl }} ;
|
||||
[AP] = LinListAP ;
|
||||
[RS] = {s1,s2 : Agr => Str ; c : NPForm} ;
|
||||
|
||||
oper
|
||||
|
||||
LinListAP : Type = {s1,s2 : {s : Bool => NForm => Str ; infl : Infl}} ;
|
||||
|
||||
--Modified from prelude/Coordination.gf generic functions
|
||||
twoTableAdj : (_,_ : AP) -> [AP] = \x,y ->
|
||||
lin ListAP {
|
||||
twoTableAdj : (_,_ : ResEst.APhrase) -> LinListAP = \x,y -> {
|
||||
s1 = x ;
|
||||
s2 = y
|
||||
} ;
|
||||
|
||||
consrTableAdj : Str -> APhrase -> [AP] -> [AP] = \c,x,xs ->
|
||||
consrTableAdj : Str -> ResEst.APhrase -> LinListAP -> LinListAP = \c,x,xs ->
|
||||
let
|
||||
ap1 = xs.s1 ;
|
||||
ap2 = xs.s2
|
||||
in
|
||||
lin ListAP {s1 =
|
||||
{s = \\isMod,nf =>
|
||||
in {
|
||||
s1 = {s = \\isMod,nf =>
|
||||
case isMod of {
|
||||
True => case <ap1.infl, ap2.infl> of {
|
||||
<(Participle|Invariable),(Participle|Invariable)> =>
|
||||
@@ -74,16 +79,15 @@ concrete ConjunctionEst of Conjunction =
|
||||
False => ap1.s ! isMod ! nf ++ c ++ ap2.s ! isMod ! nf --kassid on valmid ja suured
|
||||
} ;
|
||||
infl = Regular } ;
|
||||
s2 = x ;
|
||||
s2 = x ;
|
||||
} ;
|
||||
|
||||
|
||||
conjunctDistrTableAdj : ConjunctionDistr -> [AP] -> AP = \or,xs ->
|
||||
conjunctDistrTableAdj : ConjunctionDistr -> LinListAP -> APhrase = \or,xs ->
|
||||
let
|
||||
ap1 = xs.s1 ;
|
||||
ap2 = xs.s2 ;
|
||||
in
|
||||
lin AP {s = \\isMod,nf =>
|
||||
in {s = \\isMod,nf =>
|
||||
case isMod of {
|
||||
True => case <ap1.infl, ap2.infl> of {
|
||||
<(Participle|Invariable),(Participle|Invariable)> =>
|
||||
|
||||
@@ -16,12 +16,12 @@ lin
|
||||
let n_years_AdA : AdA = lin AdA (mkUtt (lin NP (mkNP <lin Card card : Card> L.year_N)))
|
||||
in mkVP (mkAP n_years_AdA L.old_A) ;
|
||||
|
||||
have_name_Cl x y = mkCl (mkNP (E.GenNP x) L.name_N) (lin NP y) ;
|
||||
married_Cl x y = mkCl (mkNP and_Conj (lin NP x) (lin NP y)) (ParadigmsEst.mkAdv "abielus") ;
|
||||
have_name_Cl x y = mkCl (mkNP (E.GenNP x) L.name_N) <lin NP y : NP> ;
|
||||
married_Cl x y = mkCl (mkNP and_Conj <lin NP x : NP> <lin NP y : NP>) (ParadigmsEst.mkAdv "abielus") ;
|
||||
|
||||
what_name_QCl x = mkQCl (mkIComp whatSg_IP) (mkNP (E.GenNP x) L.name_N) ;
|
||||
how_old_QCl x = mkQCl (E.ICompAP (mkAP L.old_A)) (lin NP x) ;
|
||||
how_far_QCl x = mkQCl (E.IAdvAdv L.far_Adv) (lin NP x) ;
|
||||
how_old_QCl x = mkQCl (E.ICompAP (mkAP L.old_A)) <lin NP x : NP> ;
|
||||
how_far_QCl x = mkQCl (E.IAdvAdv L.far_Adv) <lin NP x : NP> ;
|
||||
|
||||
-- some more things
|
||||
weather_adjCl ap = mkCl (mkVP (lin AP ap)) ;
|
||||
@@ -29,10 +29,13 @@ lin
|
||||
is_right_VP = mkVP have_V2 (lin NP (mkNP (ParadigmsEst.mkN "õigus"))) ;
|
||||
is_wrong_VP = mkVP (ParadigmsEst.mkV "eksima") ;
|
||||
|
||||
n_units_AP card cn a = mkAP (lin AdA (mkUtt (lin NP (mkNP <lin Card card : Card> (lin CN cn))))) (lin A a) ;
|
||||
n_units_AP card cn a =
|
||||
let x_inches_NP : NP = mkNP <lin Card card : Card> <lin CN cn : CN> ;
|
||||
x_inches_AdA : AdA = lin AdA (mkUtt x_inches_NP) ;
|
||||
in mkAP x_inches_AdA <lin A a : A> ;
|
||||
|
||||
{-
|
||||
glass_of_CN np = mkCN (lin N2 (mkN2 (mkN "klaas") (mkPrep partitive))) (lin NP np) | mkCN (lin N2 (mkN2 (mkN "klaasitäis") (mkPrep partitive))) (lin NP np) ;
|
||||
glass_of_CN np = mkCN (lin N2 (mkN2 (mkN "klaas") (casePrep partitive))) (lin NP np) | mkCN (lin N2 (mkN2 (mkN "klaasitäis") (casePrep partitive))) (lin NP np) ;
|
||||
|
||||
|
||||
where_go_QCl np = mkQCl (lin IAdv (ss "kuhu")) (mkCl np (mkVP L.go_V)) ;
|
||||
|
||||
@@ -23,7 +23,7 @@ lincat
|
||||
oper
|
||||
heading : N -> Str = \n -> (nounHeading n).s ;
|
||||
|
||||
caseplus2nf : N -> ResEst.Number -> CasePlus -> Str = \noun,num,cas ->
|
||||
caseplus2nf : ResEst.Noun -> ResEst.Number -> CasePlus -> Str = \noun,num,cas ->
|
||||
noun.s ! NCase num cas.c ++ cas.suf ;
|
||||
|
||||
caseplus2af : (AForm => Str) -> ResEst.Number -> CasePlus -> Str = \adj,num,cas ->
|
||||
@@ -65,77 +65,77 @@ lin
|
||||
InflectionV v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v)) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V v : V>)) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV2 v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.something_NP)) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V2 v : V2> S.something_NP)) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV3 v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.something_NP S.something_NP)) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V3 v : V3> S.something_NP S.something_NP)) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV2V v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.we_NP (S.mkVP (L.sleep_V)))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V2V v : V2V> S.we_NP (S.mkVP (L.sleep_V)))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV2S v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.we_NP (lin S (ss "...")))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V2S v : V2S> S.we_NP (lin S (ss "...")))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV2Q v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.we_NP (lin QS (ss "...")))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V2Q v : V2Q> S.we_NP (lin QS (ss "...")))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionV2A v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v S.we_NP L.beautiful_A)) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin V2A v : V2A> S.we_NP L.beautiful_A)) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionVV v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v (S.mkVP (L.sleep_V)))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin VV v : VV> (S.mkVP (L.sleep_V)))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionVS v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v (lin S (ss "...")))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin VS v : VS> (lin S (ss "...")))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionVQ v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v (lin QS (ss "...")))) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin VQ v : VQ> (lin QS (ss "...")))) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
InflectionVA v = {
|
||||
t = "v" ;
|
||||
s1 = heading1 (heading verb_Category) ++
|
||||
paragraph (verbExample (S.mkCl S.she_NP v L.beautiful_A)) ;
|
||||
paragraph (verbExample (S.mkCl S.she_NP <lin VA v : VA> L.beautiful_A)) ;
|
||||
s2 = inflVerb v
|
||||
} ;
|
||||
|
||||
@@ -143,16 +143,15 @@ oper
|
||||
verbExample : CatEst.Cl -> Str = \cl -> (S.mkUtt cl).s ;
|
||||
{-
|
||||
-} --# notpresent
|
||||
inflVerb : CatEst.V -> Str = \verb ->
|
||||
inflVerb : ResEst.Verb -> Str = \verb ->
|
||||
let
|
||||
--verb = sverb2verbSep verb0 ;
|
||||
vfin : ResEst.VForm -> Str = \f ->
|
||||
verb.s ! f ;
|
||||
vinf : ResEst.InfForms -> Str = \if ->
|
||||
applyInfFormsV if verb.s ;
|
||||
|
||||
nounNounHeading : Parameter -> Parameter -> Str = \n1,n2 ->
|
||||
(S.mkUtt (G.PossNP (S.mkCN n1) (S.mkNP n2))).s ;
|
||||
(S.mkUtt (G.PossNP (S.mkCN <lin N n1 : N>) (S.mkNP <lin N n2 : N>))).s ;
|
||||
in
|
||||
heading3 (nounNounHeading present_Parameter indicative_Parameter) ++
|
||||
frameTable (
|
||||
@@ -254,7 +253,7 @@ oper
|
||||
td (vfin (PastPart Pass )))
|
||||
) ; --}
|
||||
|
||||
inflNoun : (Number -> CasePlus -> Str) -> Str = \nouns ->
|
||||
inflNoun : (ResEst.Number -> CasePlus -> Str) -> Str = \nouns ->
|
||||
frameTable (
|
||||
tr (th "" ++ th (heading singular_Parameter) ++ th (heading plural_Parameter)) ++
|
||||
tr (th (heading nominative_Parameter) ++ td (nouns Sg Nominative) ++ td (nouns Pl Nominative)) ++
|
||||
|
||||
@@ -54,6 +54,10 @@ concrete ExtendEst of Extend =
|
||||
VPI2 = X.VPI ** {c2 : Compl} ;
|
||||
[VPI2] = X.ListVPI ** {c2 : Compl} ;
|
||||
|
||||
linref
|
||||
VPS = X.linVPS (agrP3 Sg) ;
|
||||
VPI = X.linVPI InfMa ;
|
||||
|
||||
lin
|
||||
MkVPS = X.MkVPS ;
|
||||
BaseVPS = X.BaseVPS ;
|
||||
@@ -256,12 +260,12 @@ concrete ExtendEst of Extend =
|
||||
-- : NP -> VS -> Utt -> Cl ; -- "I am here", she said
|
||||
FrontComplDirectVS np vs utt =
|
||||
let cl : Cl = PredVP np (UseV vs) ;
|
||||
in cl ** {s = \\t,a,p,o => utt.s ++ bindComma ++ cl.s ! t ! a ! p ! o} ;
|
||||
in cl ** {s = \\t,a,p => utt.s ++ bindComma ++ cl.s ! t ! a ! p} ;
|
||||
|
||||
-- : NP -> VQ -> Utt -> Cl ; -- "where", she asked
|
||||
FrontComplDirectVQ np vq utt =
|
||||
let cl : Cl = PredVP np (UseV vq) ;
|
||||
in cl ** {s = \\t,a,p,o => utt.s ++ bindComma ++ cl.s ! t ! a ! p ! o} ;
|
||||
in cl ** {s = \\t,a,p => utt.s ++ bindComma ++ cl.s ! t ! a ! p} ;
|
||||
|
||||
|
||||
---------------------------------
|
||||
@@ -298,8 +302,12 @@ concrete ExtendEst of Extend =
|
||||
GerundAdv vp = {s = infVPdefault vp InfDes} ;
|
||||
|
||||
-- : VP -> CN -- publishing of the document (can get a determiner)
|
||||
GerundCN vp = emptyCN ** {s = \\nf => infVPdefault vp InfMine} ;
|
||||
|
||||
GerundCN vp = emptyCN ** {
|
||||
s = \\nf => infVPdefault vp {stem = InfM ; suf = []}
|
||||
++ ine.s ! nf ;
|
||||
} where {
|
||||
ine : N = mkN "ine" "ise" "ist" "isesse" "iste" "isi"
|
||||
} ;
|
||||
-- : VP -> NP -- publishing the document (by nature definite)
|
||||
GerundNP vp = MassNP (GerundCN vp) ;
|
||||
|
||||
@@ -345,7 +353,7 @@ concrete ExtendEst of Extend =
|
||||
|
||||
-- : VPSlash -> AP ; -- täna leitud
|
||||
PastPartAP vp = {
|
||||
s = \\_,_ => vp2adv vp True (VIPass Past) ;
|
||||
s = \\_,_ => vp2adv <vp : VP> <True : Bool> <PastPart Pass : VForm> ;
|
||||
infl = Invariable
|
||||
} ;
|
||||
|
||||
@@ -357,7 +365,8 @@ concrete ExtendEst of Extend =
|
||||
|
||||
-- : VPSlash -> NP -> AP -- hobisukeldujate poolt leitud (süvaveepomm)
|
||||
PastPartAgentAP vp np = {
|
||||
s = \\_,_ => appCompl True Pos by8agent_Prep np ++ vp2adv vp True (VIPass Past) ;
|
||||
s = \\_,_ => appCompl True Pos by8agent_Prep np
|
||||
++ vp2adv <vp : VP> <True : Bool> <PastPart Pass : VForm> ;
|
||||
infl = Invariable
|
||||
} ;
|
||||
|
||||
@@ -385,17 +394,25 @@ concrete ExtendEst of Extend =
|
||||
-- calling infVP with the "default arguments": NPCase Nom, Pos, agrP3 Sg
|
||||
infVPdefault : VP -> InfForms -> Str = infVP (NPCase Nom) Pos (agrP3 Sg) ;
|
||||
|
||||
vp2adv : R.VP -> Bool -> VIForm -> Str = \vp,sentIsPos,vif ->
|
||||
let vpforms : {fin,inf : Str} = case vif of {
|
||||
VIInf if => applyInfFormsVP {stem=if ; suf="a"} vp ; --- this oper shouldn't be used if you want to use an InfForm but just trying to be robust here
|
||||
_ => mkVPForms vp.v ! vif ! Simul ! Pos ! agrP3 Sg} ;
|
||||
in vp.s2 ! sentIsPos ! Pos ! agrP3 Sg -- raamatut
|
||||
++ vp.adv -- paremini
|
||||
++ vp.p -- ära
|
||||
++ vpforms.fin -- tunda/tundes/tundmata/...
|
||||
++ vpforms.inf -- TODO is this necessary???
|
||||
++ vp.ext ;
|
||||
vp2adv = overload {
|
||||
|
||||
vp2adv : R.VP -> Bool -> VIForm -> Str = \vp,sentIsPos,vif ->
|
||||
let vpforms : {fin,inf : Str} = case vif of {
|
||||
VIInf if => applyInfFormsVP {stem=if ; suf="a"} vp ; --- this oper shouldn't be used if you want to use an InfForm but just trying to be robust here
|
||||
_ => mkVPForms vp.v ! vif ! Simul ! Pos ! agrP3 Sg} ;
|
||||
in vp.s2 ! sentIsPos ! Pos ! agrP3 Sg -- raamatut
|
||||
++ vp.adv -- paremini
|
||||
++ vp.p -- ära
|
||||
++ vpforms.fin -- tunda/tundes/tundmata/...
|
||||
++ vpforms.inf -- TODO is this necessary???
|
||||
++ vp.ext ;
|
||||
vp2adv : R.VP -> Bool -> VForm -> Str = \vp,sentIsPos,vf ->
|
||||
vp.s2 ! sentIsPos ! Pos ! agrP3 Sg -- raamatut
|
||||
++ vp.adv -- paremini
|
||||
++ vp.p -- ära
|
||||
++ vp.v.s ! vf -- tuntud
|
||||
++ vp.ext
|
||||
} ;
|
||||
---------------------------------
|
||||
-- S - W
|
||||
|
||||
@@ -420,4 +437,9 @@ concrete ExtendEst of Extend =
|
||||
WithoutVP vp = {s = "ilma" ++ infVPdefault vp InfMata} ;
|
||||
|
||||
|
||||
lin GivenName, MaleSurname, FemaleSurname = \n -> n ;
|
||||
lin FullName gn sn = {
|
||||
s = \\c => gn.s ! Nom ++ sn.s ! c
|
||||
} ;
|
||||
|
||||
}
|
||||
|
||||
@@ -23,15 +23,24 @@ concrete ExtraEst of ExtraEstAbs = CatEst **
|
||||
--- a = RAg (agrP3 num.n)
|
||||
} ;
|
||||
oper
|
||||
caseCN : CasePlus -> NP -> CN -> CN = \c,np,cn -> cn ** {
|
||||
caseCN : CasePlus -> NPhrase -> CNoun -> CNoun = \c,np,cn -> cn ** {
|
||||
s = \\nf => appCompl True Pos (P.casePrep c) np ++ cn.s ! nf
|
||||
} ;
|
||||
|
||||
lincat
|
||||
VPI = {s : InfStem => Str} ;
|
||||
[VPI] = {s1,s2 : InfStem => Str} ;
|
||||
-- VPI = {s : Str} ;
|
||||
-- [VPI] = {s1,s2 : Str} ;
|
||||
VPI = LinVPI ;
|
||||
[VPI] = LinListVPI ;
|
||||
|
||||
oper
|
||||
LinVPI : Type = {s : InfStem => Str} ;
|
||||
LinListVPI : Type = {s1,s2 : InfStem => Str} ;
|
||||
|
||||
linVPI : InfForms -> LinVPI -> Str = \inf,vpi -> vpi.s ! inf.stem ;
|
||||
|
||||
-- Version that uses InfStem
|
||||
infVPIF : NPForm -> Polarity -> Agr -> ResEst.VP -> InfStem -> Str = \sc,pol,agr,vp,if ->
|
||||
infVPAnt Simul sc pol agr vp {stem=if ; suf="a"} ;
|
||||
|
||||
lin
|
||||
BaseVPI = twoTable InfStem ;
|
||||
ConsVPI = consrTable InfStem comma ;
|
||||
@@ -41,23 +50,41 @@ concrete ExtraEst of ExtraEstAbs = CatEst **
|
||||
ComplVPIVV vv vpi =
|
||||
insertObj (\\_,_,_ => vpi.s ! vv.vi.stem) (predV vv) ;
|
||||
|
||||
oper
|
||||
-- Version that uses InfStem
|
||||
infVPIF : NPForm -> Polarity -> Agr -> VP -> InfStem -> Str = \sc,pol,agr,vp,if ->
|
||||
infVPAnt Simul sc pol agr vp {stem=if ; suf="a"} ;
|
||||
|
||||
|
||||
lincat
|
||||
VPS = {
|
||||
VPS = LinVPS ;
|
||||
[VPS] = LinListVPS ;
|
||||
oper
|
||||
LinVPS : Type = {
|
||||
s : Agr => Str ;
|
||||
sc : NPForm ; --- can be different for diff parts
|
||||
} ;
|
||||
|
||||
[VPS] = {
|
||||
LinListVPS : Type = {
|
||||
s1,s2 : Agr => Str ;
|
||||
sc : NPForm ; --- take the first: minä osaan kutoa ja täytyy virkata
|
||||
} ;
|
||||
|
||||
linVPS : Agr -> {s : Agr => Str} -> Str = \agr,vps -> vps.s ! agr ;
|
||||
|
||||
-- This internal oper isn't used in any of the RGL linearisations, but can be useful for application grammars
|
||||
-- It produces a telegraphic style in past participle, 'võetud …' instead of 'on/oli võetud …'.
|
||||
-- It differs from PastPartAP in word order, and it also takes polarity.
|
||||
TelegraphicPastPartPassVPS : Pol -> ResEst.VP -> VPS = \p,vp ->
|
||||
let sentIsPos : Bool = case p.p of {
|
||||
Neg => False ;
|
||||
Pos => True } ;
|
||||
neg : Str = case p.p of {
|
||||
Neg => "ei" ;
|
||||
Pos => [] } ;
|
||||
in lin VPS {
|
||||
s = \\a => neg -- ei
|
||||
++ vp.v.s ! (PastPart Pass) -- võetud
|
||||
++ vp.s2 ! sentIsPos ! p.p ! a -- vereanalüüs
|
||||
++ vp.adv -- eile
|
||||
++ vp.p
|
||||
++ vp.ext ;
|
||||
sc = vp.sc
|
||||
};
|
||||
|
||||
lin
|
||||
BaseVPS x y = twoTable Agr x y ** {sc = x.sc} ;
|
||||
ConsVPS x y = consrTable Agr comma x y ** {sc = x.sc} ;
|
||||
@@ -108,7 +135,7 @@ concrete ExtraEst of ExtraEstAbs = CatEst **
|
||||
(\\_,b,_ => linNP (NPCase Nom) np)
|
||||
(predV (verbOlema ** {sc = NPCase Nom}))) ;
|
||||
in
|
||||
cl.s ! t ! ant ! bo ! SDecl ;
|
||||
cl.s ! t ! ant ! bo ;
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
|
||||
@@ -117,18 +144,20 @@ concrete ExtraEst of ExtraEstAbs = CatEst **
|
||||
(\\_,b,_ => linNP (NPCase Nom) np) (predV v)) ;
|
||||
|
||||
ICompExistNP adv np =
|
||||
let cl = mkClause (\_ -> adv.s ! np.a) np.a (insertObj
|
||||
(\\_,b,_ => linNP (NPCase Nom) np) (predV (verbOlema ** {sc = NPCase Nom}))) ;
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
let subj : Polarity -> Str = \_ -> adv.s ! np.a ;
|
||||
pred : ResEst.VP = insertObj
|
||||
(\\_,b,_ => linNP (NPCase Nom) np)
|
||||
(predV (verbOlema ** {sc = NPCase Nom})) ;
|
||||
in mkClause subj np.a pred ;
|
||||
|
||||
|
||||
IAdvPredNP iadv v np =
|
||||
let cl = mkClause (\_ -> iadv.s) np.a (insertObj
|
||||
(\\_,b,_ => linNP v.sc np) (predV v)) ;
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
let subj : Polarity -> Str = \_ -> iadv.s ;
|
||||
pred : ResEst.VP = insertObj
|
||||
(\\_,b,_ => linNP v.sc np)
|
||||
(predV v) ;
|
||||
in mkClause subj np.a pred ;
|
||||
|
||||
|
||||
-- i_implicPron = mkPronoun [] "minun" "minua" "minuna" "minuun" Sg P1 ;
|
||||
whatPart_IP = emptyIP ** {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
abstract ExtraEstAbs = Extra [
|
||||
GenNP,GenIP,GenRP,
|
||||
PassVPSlash, PassAgentVPSlash,
|
||||
GenNP,GenIP,GenRP,IP,IQuant,Num,CN,RP,
|
||||
PassVPSlash, PassAgentVPSlash, VPSlash,
|
||||
VPI,ListVPI,BaseVPI,ConsVPI,MkVPI,ComplVPIVV,ConjVPI,
|
||||
VPS,ListVPS,BaseVPS,ConsVPS,ConjVPS,MkVPS,PredVPS,ConjVPS,Tense,Temp,Pol,S,
|
||||
VV,VP,Conj,NP,Quant,IAdv,IComp,ICompAP,IAdvAdv,Adv,AP, Pron, ProDrop] ** {
|
||||
|
||||
@@ -5,23 +5,17 @@ concrete IdiomEst of Idiom = CatEst **
|
||||
|
||||
lin
|
||||
ExistNP np =
|
||||
let
|
||||
cas : Polarity -> NPForm = \p -> case p of {
|
||||
Pos => NPCase Nom ; -- on olemas lammas
|
||||
Neg => NPCase Part -- ei ole olemas lammast
|
||||
} ;
|
||||
vp = insertObj (\\_,b,_ => "olemas" ++ linNP (cas b) np) (predV olla)
|
||||
in
|
||||
existClause noSubj (agrP3 Sg) vp ;
|
||||
let cas : Polarity -> NPForm = \p -> case p of {
|
||||
Pos => NPCase Nom ; -- on olemas lammas
|
||||
Neg => NPCase Part } ; -- ei ole olemas lammast
|
||||
vp = insertObj (\\_,b,_ => "olemas" ++ linNP (cas b) np) (predV olla)
|
||||
in existClause noSubj (agrP3 Sg) vp ;
|
||||
|
||||
ExistIP ip =
|
||||
let
|
||||
cas : NPForm = NPCase Nom ; ---- also partitive in Extra
|
||||
vp = insertObj (\\_,b,_ => "olemas") (predV olla) ;
|
||||
cl = existClause (subjForm (ip ** {isPron = False ; a = agrP3 ip.n}) cas) (agrP3 Sg) vp
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
let cas : NPForm = NPCase Nom ; ---- also partitive in Extra
|
||||
vp : MorphoEst.VP = insertObj (\\_,b,_ => "olemas") (predV olla) ;
|
||||
subj : MorphoEst.NPhrase = ip ** {isPron = False ; a = agrP3 ip.n} ;
|
||||
in existClause (subjForm subj cas) (agrP3 Sg) vp ;
|
||||
|
||||
-- Notice the nominative in the cleft $NP$: "se on Matti josta Liisa pitää"
|
||||
-- Est: "see on Mati, kellest Liis lugu peab"
|
||||
|
||||
@@ -160,7 +160,7 @@ lin
|
||||
science_N = mkN "teadus" ;
|
||||
sea_N = mkN "meri" "mere" "merd" "merre" "merede" "meresid" ;
|
||||
seek_V2 = mkV2 (mkV "otsima") cpartitive ;
|
||||
see_V2 = mkV2 (mkV "nägema" "näha") ;
|
||||
see_V2 = mkV2 (mkV "nägema" "näha") cpartitive ;
|
||||
sell_V3 = mkV3 (mkV "müüma" "müüa" "müüb" "müüakse" "müüge" "müüs" "müünud" "müüdud") accPrep callative ;
|
||||
send_V3 = mkV3 (mkV "saatma") accPrep callative ;
|
||||
sheep_N = mkN "lammas" "lamba" "lammast" ;
|
||||
|
||||
@@ -216,8 +216,7 @@ concrete NounEst of Noun = CatEst ** open ResEst, HjkEst, MorphoEst, Prelude in
|
||||
|
||||
oper
|
||||
numN : NForm -> Number = \nf -> case nf of {
|
||||
NCase n _ => n ;
|
||||
_ => Sg ---
|
||||
NCase n _ => n
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ concrete NumeralEst of Numeral = CatEst [Numeral,Digits] ** open Prelude, Parad
|
||||
flags optimize=all_subs ; coding=utf8;
|
||||
|
||||
lincat
|
||||
Sub1000000 = {s : CardOrd => Str ; n : MorphoEst.Number} ;
|
||||
Sub1000000, Sub1000000000, Sub1000000000000 = {s : CardOrd => Str ; n : MorphoEst.Number} ;
|
||||
Digit = {s : CardOrd => Str} ;
|
||||
Sub10, Sub100, Sub1000 = {s : NumPlace => CardOrd => Str ; n : MorphoEst.Number} ;
|
||||
|
||||
@@ -65,6 +65,9 @@ lin
|
||||
s = \\c => d.s ! NumAttr ! c ++ tuhattaN.s ! d.n ! c ++ e.s ! NumIndep ! c
|
||||
} ;
|
||||
|
||||
pot3as4 n = n ;
|
||||
pot4as5 n = n ;
|
||||
|
||||
oper
|
||||
co : (c,o : {s : NForm => Str}) -> {s : CardOrd => Str} = \c,o -> {
|
||||
s = table {
|
||||
@@ -73,7 +76,7 @@ oper
|
||||
}
|
||||
} ;
|
||||
|
||||
nBIND : Number -> Str = \n -> case n of {Sg => [] ; _ => BIND} ; -- no BIND after silent 1
|
||||
nBIND : MorphoEst.Number -> Str = \n -> case n of {Sg => [] ; _ => BIND} ; -- no BIND after silent 1
|
||||
|
||||
param
|
||||
NumPlace = NumIndep | NumAttr ;
|
||||
|
||||
@@ -83,6 +83,12 @@ oper
|
||||
postGenPrep : Str -> Prep ; -- genitive postposition, e.g. "taga"
|
||||
casePrep : Case -> Prep ; -- just case, e.g. adessive
|
||||
|
||||
mkPrep : overload {
|
||||
mkPrep : Str -> Prep ; -- API-friendly version of postGenPrep—many applications assume there is a `mkX : Str -> X' available for any X
|
||||
mkPrep : Case -> Prep ; -- API-friendly version of casePrep
|
||||
mkPrep : Case -> Str -> Prep ; -- API-friendly version of postPrep
|
||||
} ;
|
||||
|
||||
|
||||
--2 Conjunctions, adverbs
|
||||
|
||||
@@ -311,19 +317,25 @@ oper
|
||||
infDa = InfDa ; infMa = InfMa ; infMast = InfMast ;
|
||||
infDes = InfDes ; infMas = InfMas ; infMaks = InfMaks ; infMata = InfMata ; infMine = InfMine ;
|
||||
|
||||
mkPrep : (isPre : Bool) -> Case -> Str -> Prep = \isPre,c,p -> lin Prep {
|
||||
mkAdposition : (isPre : Bool) -> Case -> Str -> Prep = \isPre,c,p -> lin Prep {
|
||||
c = casep2npformp c ;
|
||||
s = p ;
|
||||
isPre = isPre
|
||||
} ;
|
||||
prePrep : Case -> Str -> Prep = mkPrep True ;
|
||||
postPrep : Case -> Str -> Prep = mkPrep False ;
|
||||
prePrep : Case -> Str -> Prep = mkAdposition True ;
|
||||
postPrep : Case -> Str -> Prep = mkAdposition False ;
|
||||
postGenPrep : Str -> Prep = postPrep genitive ;
|
||||
mkPrep = overload {
|
||||
mkPrep : Str -> Prep = postGenPrep ;
|
||||
mkPrep : Case -> Prep = casePrep ;
|
||||
mkPrep : Case -> Str -> Prep = postPrep ;
|
||||
mkPrep : (isPre : Bool) -> Case -> Str -> Prep = mkAdposition
|
||||
} ;
|
||||
|
||||
-- The Prep's isPre field is used in a special (hacky) way in mkN3 and mkN2.
|
||||
-- Used to be able to match whether the Prep's case is Gen, but now several
|
||||
-- Preps use the genitive stem, so we need to check if it's actually genitive.
|
||||
casePrep : Case -> Prep = \c -> mkPrep (isActuallyGenitive c) c [] ;
|
||||
casePrep : Case -> Prep = \c -> mkAdposition (isActuallyGenitive c) c [] ;
|
||||
|
||||
-- NPAcc is different, it's not formed from a Case(Plus)
|
||||
accPrep : Prep = lin Prep {
|
||||
@@ -605,9 +617,10 @@ oper
|
||||
mkA : N -> A = \n -> noun2adjDeg n ** {infl = Regular} ;
|
||||
mkA : N -> (parem,parim : Str) -> A = regAdjective ;
|
||||
mkA : N -> (infl : Infl) -> A = \n,infl -> noun2adjDeg n ** {infl = infl} ;
|
||||
-- TODO: temporary usage of regAdjective1
|
||||
mkA : N -> (valmim,valmeim : Str) -> (infl : Infl) -> A =
|
||||
\n,c,s,infl -> (regAdjective1 n c s) ** {infl = infl} ;
|
||||
\n,c,s,infl ->
|
||||
let regA : A = regAdjective n c s
|
||||
in regA ** {infl = infl} ;
|
||||
} ;
|
||||
|
||||
invA balti = lin A {s = \\_,_ => balti ; infl = Invariable} ;
|
||||
@@ -632,11 +645,6 @@ oper
|
||||
(noun2adjComp False (nForms2N (hjk_type_IVb_audit compar "a")))
|
||||
(noun2adjComp False (nForms2N (hjk_type_IVb_audit superl "a"))) ;
|
||||
|
||||
-- TODO: this is a temporary hack that converts A ~> Adjective.
|
||||
-- The caller needs this otherwise ** fails.
|
||||
-- This should be cleaned up but I don't know how (K).
|
||||
regAdjective1 : Noun -> Str -> Str -> Adjective = regAdjective ;
|
||||
|
||||
-- Adjectives whose comparison forms can be derived from the sg gen.
|
||||
-- In case of comparative this fails only for 70 adjectives.
|
||||
-- Superlative is more complex, and does not always exist,
|
||||
|
||||
@@ -5,15 +5,10 @@ concrete QuestionEst of Question = CatEst ** open ResEst, Prelude in {
|
||||
lin
|
||||
|
||||
QuestCl cl = {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SQuest
|
||||
s = \\t,a,p => "kas" ++ cl.s ! t ! a ! p
|
||||
} ;
|
||||
|
||||
QuestVP ip vp =
|
||||
let
|
||||
cl = mkClause (subjForm (ip ** {isPron = False ; a = agrP3 ip.n}) vp.sc) (agrP3 ip.n) vp
|
||||
in {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl
|
||||
} ;
|
||||
QuestVP ip vp = mkClause (subjForm (ip ** {isPron = False ; a = agrP3 ip.n}) vp.sc) (agrP3 ip.n) vp ;
|
||||
|
||||
QuestSlash ip slash = {
|
||||
s = \\t,a,p =>
|
||||
@@ -25,7 +20,7 @@ concrete QuestionEst of Question = CatEst ** open ResEst, Prelude in {
|
||||
} ;
|
||||
|
||||
QuestIAdv iadv cl = {
|
||||
s = \\t,a,p => iadv.s ++ cl.s ! t ! a ! p ! SDecl
|
||||
s = \\t,a,p => iadv.s ++ cl.s ! t ! a ! p
|
||||
} ;
|
||||
|
||||
QuestIComp icomp np = {
|
||||
@@ -34,7 +29,7 @@ concrete QuestionEst of Question = CatEst ** open ResEst, Prelude in {
|
||||
vp = predV (verbOlema ** {sc = NPCase Nom}) ;
|
||||
cl = mkClause (subjForm np vp.sc) np.a vp ;
|
||||
in
|
||||
icomp.s ! np.a ++ cl.s ! t ! a ! p ! SDecl
|
||||
icomp.s ! np.a ++ cl.s ! t ! a ! p
|
||||
} ;
|
||||
|
||||
PrepIP p ip = {s =
|
||||
@@ -44,53 +39,48 @@ concrete QuestionEst of Question = CatEst ** open ResEst, Prelude in {
|
||||
postmod = ip.postmod ++ adv.s ;
|
||||
} ;
|
||||
|
||||
-- The computation of $ncase$ is a special case of that in $NounEst.DetCN$,
|
||||
-- since we don't have possessive suffixes or definiteness.
|
||||
--- It could still be nice to have a common oper...
|
||||
-- The computation of $IdetCN$ is a special case of that in $NounEst.DetCN$,
|
||||
-- because the interrogative doesn't agree.
|
||||
|
||||
IdetCN idet cn = let n = idet.n in emptyIP ** {
|
||||
IdetCN idet cn = emptyIP ** {
|
||||
s = \\c =>
|
||||
let
|
||||
k : Case = npform2case n c ;
|
||||
icase : Case = Nom ; --case k of { --mis kassiga
|
||||
-- (Ess|Abess|Comit|Termin) => Gen ;
|
||||
-- _ => k
|
||||
-- } ;
|
||||
ncase : NForm = case <icase,idet.isNum> of {
|
||||
<Nom, True> => NCase Sg Part ; -- mitkä kolme kytkintä
|
||||
<_, True> => NCase Sg k ; -- miksi kolmeksi kytkimeksi
|
||||
_ => NCase n k -- mitkä kytkimet
|
||||
k : Case = npform2case n c ;
|
||||
ncase : NForm = case <k,idet.isNum> of {
|
||||
<Nom, True> => NCase Sg Part ; -- TODO estonian example (Fin was "mitkä kolme kytkintä")
|
||||
<_, True> => NCase Sg k ; -- TODO estonian example (Fin was "miksi kolmeksi kytkimeksi")
|
||||
_ => NCase n k -- TODO estonian example (Fin was "mitkä kytkimet")
|
||||
}
|
||||
in
|
||||
idet.s ! icase ++ cn.s ! ncase ;
|
||||
n = n
|
||||
} ;
|
||||
idet.s ! Nom ++ -- mis
|
||||
idet.post ! k ++ -- kolme
|
||||
cn.s ! ncase ; -- kassi+ga
|
||||
n = idet.n ; -- needed for agreement, "mis kolm kassi mängivad"
|
||||
} where {
|
||||
n : Number = case idet.isNum of {
|
||||
True => Sg ;
|
||||
False => idet.n } ;
|
||||
} ;
|
||||
|
||||
IdetIP idet = let n = idet.n in emptyIP ** {
|
||||
s = \\c =>
|
||||
let
|
||||
k = npform2case n c ;
|
||||
in
|
||||
idet.s ! k ;
|
||||
case idet.isNum of {
|
||||
True => idet.s ! Nom ++ idet.post ! k ;
|
||||
False => idet.s ! k ++ idet.post ! k
|
||||
} ;
|
||||
|
||||
n = n
|
||||
} ;
|
||||
|
||||
IdetQuant idet num =
|
||||
let
|
||||
n = num.n ;
|
||||
isn = num.isNum
|
||||
in {
|
||||
s = \\k =>
|
||||
let
|
||||
ncase = case <k,isn> of {
|
||||
<Nom, True> => NCase Sg Part ; -- mitkä kolme kytkintä
|
||||
<_, True> => NCase Sg k ; -- miksi kolmeksi kytkimeksi
|
||||
_ => NCase n k -- mitkä kytkimet
|
||||
}
|
||||
in
|
||||
idet.s ! n ! k ++ num.s ! Sg ! k ;
|
||||
n = n ;
|
||||
isNum = isn
|
||||
-- The quant and the num may be inflected in different cases:
|
||||
-- * mis kolme koeraga, mis kolmega
|
||||
-- * millega
|
||||
-- * mille 3-ga (this would be the preferable output, but currently outputs "mis 3ga")
|
||||
IdetQuant idet num = num ** {
|
||||
s = \\c => idet.s ! num.n ! c ;
|
||||
post = \\c => num.s ! Sg ! c ;
|
||||
} ;
|
||||
|
||||
AdvIAdv i a = {s = i.s ++ a.s} ;
|
||||
|
||||
@@ -5,7 +5,7 @@ concrete RelativeEst of Relative = CatEst ** open Prelude, ResEst, MorphoEst in
|
||||
lin
|
||||
|
||||
RelCl cl = {
|
||||
s = \\t,a,p,_ => "nii" ++ "et" ++ cl.s ! t ! a ! p ! SDecl ;
|
||||
s = \\t,a,p,_ => "nii" ++ "et" ++ cl.s ! t ! a ! p ;
|
||||
---- sellainen
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
@@ -23,7 +23,7 @@ concrete RelativeEst of Relative = CatEst ** open Prelude, ResEst, MorphoEst in
|
||||
vp.sc)
|
||||
agr vp
|
||||
in
|
||||
cl.s ! t ! ant ! b ! SDecl ;
|
||||
cl.s ! t ! ant ! b ;
|
||||
c = NPCase Nom
|
||||
} ;
|
||||
|
||||
|
||||
@@ -180,8 +180,6 @@ oper
|
||||
glue (vf ! Inf if.stem) if.suf ;
|
||||
|
||||
param
|
||||
SType = SDecl | SQuest | SInv ;
|
||||
|
||||
--2 For $Relative$
|
||||
|
||||
RAgr = RNoAg | RAg Agr ;
|
||||
@@ -207,6 +205,8 @@ param
|
||||
|
||||
Compl : Type = {s : Str ; c : NPFormPlus ; isPre : Bool} ;
|
||||
|
||||
emptyCompl : Compl = {s = "" ; c = case2npformp NPAcc ; isPre = False} ;
|
||||
|
||||
npfplus2compl : NPFormPlus -> Compl = \npf -> {s = [] ; c = npf ; isPre = False} ;
|
||||
|
||||
appCompl : Bool -> Polarity -> Compl -> NPhrase -> Str = \isFin,b,co,np ->
|
||||
@@ -363,51 +363,34 @@ oper
|
||||
-- For $Sentence$.
|
||||
|
||||
Clause : Type = {
|
||||
s : Tense => Anteriority => Polarity => SType => Str
|
||||
s : Tense => Anteriority => Polarity => Str
|
||||
} ;
|
||||
|
||||
ClausePlus : Type = {
|
||||
s : Tense => Anteriority => Polarity => {subj,fin,inf,compl,adv,p,ext : Str}
|
||||
} ;
|
||||
|
||||
-- The Finnish version of SQuest featured a word order change and
|
||||
-- the question particle "ko". The Estonian version just prefixes the
|
||||
-- declarative sentence with the yes/no-queryword "kas".
|
||||
-- SQuest: "kas" + SDecl
|
||||
-- It would be also correct to use the Finnish structure, just without the ko-particle.
|
||||
-- Inari: added a third SType, SInv.
|
||||
-- Not sure if SInv is needed, but keeping it for possible future use.
|
||||
-- There's need for an inverted word order with auxiliary verbs; infVP handles that. ComplVV calls infVP, which inverts the word order for the complement VP, and puts it into the resulting VP's `compl' field.
|
||||
-- SInv made by mkClause would be for cases where you just need to construct an inverted word order, and then call it from some other place; application grammar (TODO: api oper for SType) or ExtraEst.
|
||||
mkClause : (Polarity -> Str) -> Agr -> VP -> Clause = \sub,agr,vp ->
|
||||
{ s = \\t,a,b =>
|
||||
let
|
||||
c = (mkClausePlus sub agr vp).s ! t ! a ! b ;
|
||||
-- saan sinust aru 0
|
||||
-- ma olen täna sinust aru saanud
|
||||
declCl = c.subj ++ c.fin ++ c.adv ++ c.compl ++ c.p ++ c.inf ++ c.ext ;
|
||||
-- [sind näha] 0 tahtnud
|
||||
-- täna olen ma sinust aru saanud
|
||||
invCl = c.adv ++ c.fin ++ c.subj ++ c.compl ++ c.p ++ c.inf ++ c.ext
|
||||
in
|
||||
table {
|
||||
SDecl => declCl ;
|
||||
SQuest => "kas" ++ declCl ;
|
||||
SInv => invCl
|
||||
}
|
||||
} ;
|
||||
-- saan sinust aru
|
||||
-- ma olen täna sinust aru saanud
|
||||
c.subj ++ c.fin ++ c.adv ++ c.compl ++ c.p ++ c.inf ++ c.ext ;
|
||||
} ;
|
||||
|
||||
existClause : (Polarity -> Str) -> Agr -> VP -> Clause = \sub,agr,vp ->
|
||||
{ s = \\t,a,b =>
|
||||
let
|
||||
c = (mkClausePlus sub agr vp).s ! t ! a ! b ;
|
||||
-- (mis) on olnud olemas (lammas)
|
||||
declCl = c.subj ++ c.fin ++ c.inf ++ c.compl ;
|
||||
in
|
||||
table {
|
||||
SQuest => "kas" ++ declCl ;
|
||||
_ => declCl
|
||||
}
|
||||
-- c.subj ++ c.fin ++ c.inf ++ c.compl ;
|
||||
-- saan sinust aru
|
||||
-- ma olen täna sinust aru saanud
|
||||
-- (mis) on olnud täna olemas …
|
||||
c.subj ++ c.fin ++ c.inf ++ c.adv ++ c.p ++ c.compl ++ c.ext ;
|
||||
|
||||
} ;
|
||||
|
||||
mkClausePlus : (Polarity -> Str) -> Agr -> VP -> ClausePlus =
|
||||
@@ -806,7 +789,9 @@ oper
|
||||
isDef : Bool -- True (verb agrees in Pl, Nom is not Part) --I: actually, can we get rid of this?
|
||||
} ;
|
||||
|
||||
IDeterminer : Type = {s : Case => Str ; n : Number ; isNum : Bool} ;
|
||||
IDeterminer : Type = {s, post : Case => Str ; n : Number ; isNum : Bool} ;
|
||||
|
||||
linIDet : IDeterminer -> Str = \idet -> idet.s ! Nom ++ idet.post ! Nom ;
|
||||
|
||||
heavyDet : PDet -> Determiner = \d -> d ** {sp = d.s} ;
|
||||
PDet : Type = {
|
||||
|
||||
@@ -19,8 +19,7 @@ concrete SentenceEst of Sentence = CatEst ** open Prelude, ResEst in {
|
||||
|
||||
-- The object case is formed at the use site of $c2$, in $Relative$ and $Question$.
|
||||
|
||||
SlashVP np vp = {
|
||||
s = \\t,a,p => (mkClause (subjForm np vp.sc) np.a vp).s ! t ! a ! p ! SDecl ;
|
||||
SlashVP np vp = mkClause (subjForm np vp.sc) np.a vp ** {
|
||||
c2 = vp.c2
|
||||
} ;
|
||||
|
||||
@@ -29,26 +28,23 @@ concrete SentenceEst of Sentence = CatEst ** open Prelude, ResEst in {
|
||||
c2 = slash.c2
|
||||
} ;
|
||||
|
||||
SlashPrep cl prep = {
|
||||
s = \\t,a,p => cl.s ! t ! a ! p ! SDecl ;
|
||||
SlashPrep cl prep = cl ** {
|
||||
c2 = prep
|
||||
} ;
|
||||
|
||||
SlashVS np vs slash = {
|
||||
s = \\t,a,p =>
|
||||
(mkClause (subjForm np vs.sc) np.a
|
||||
(insertExtrapos (etta_Conj ++ slash.s)
|
||||
(predV vs))
|
||||
).s ! t ! a ! p ! SDecl ;
|
||||
c2 = slash.c2
|
||||
} ;
|
||||
SlashVS np vs slash =
|
||||
let cl : Clause =
|
||||
mkClause
|
||||
(subjForm np vs.sc) np.a
|
||||
(insertExtrapos (etta_Conj ++ slash.s) (predV vs))
|
||||
in cl ** {c2 = slash.c2} ;
|
||||
|
||||
|
||||
EmbedS s = {s = etta_Conj ++ s.s} ;
|
||||
EmbedQS qs = {s = qs.s} ;
|
||||
EmbedVP vp = {s = infVP (NPCase Nom) Pos (agrP3 Sg) vp InfDa} ; --- case,pol,agr,infform
|
||||
|
||||
UseCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! SDecl} ;
|
||||
UseCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ;
|
||||
UseQCl t p cl = {s = t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p} ;
|
||||
UseRCl t p cl = {
|
||||
s = \\r => t.s ++ p.s ++ cl.s ! t.t ! t.a ! p.p ! r ;
|
||||
|
||||
@@ -48,6 +48,7 @@ concrete StructuralEst of Structural = CatEst **
|
||||
how8much_IAdv = ss "kui palju" ;
|
||||
how8many_IDet = {
|
||||
s = \\c => "kui" ++ (mkN "mitu" "mitme" "mitut" "TODO" "TODO" "TODO").s ! NCase Sg c ;
|
||||
post = \\c => [] ;
|
||||
n = Sg ;
|
||||
isNum = False
|
||||
} ;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user