rwdeliza 0.03
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ElizaData/database/db.1 +7015 -0
- data/ElizaData/database/db.10 +7001 -0
- data/ElizaData/database/db.11 +7001 -0
- data/ElizaData/database/db.12 +7003 -0
- data/ElizaData/database/db.13 +7003 -0
- data/ElizaData/database/db.14 +7008 -0
- data/ElizaData/database/db.15 +7001 -0
- data/ElizaData/database/db.16 +7001 -0
- data/ElizaData/database/db.17 +7001 -0
- data/ElizaData/database/db.18 +7001 -0
- data/ElizaData/database/db.19 +7001 -0
- data/ElizaData/database/db.2 +7001 -0
- data/ElizaData/database/db.20 +5467 -0
- data/ElizaData/database/db.3 +7001 -0
- data/ElizaData/database/db.4 +7001 -0
- data/ElizaData/database/db.5 +7001 -0
- data/ElizaData/database/db.6 +7001 -0
- data/ElizaData/database/db.7 +7001 -0
- data/ElizaData/database/db.8 +7001 -0
- data/ElizaData/database/db.9 +7001 -0
- data/ElizaData/responses/hello.res +1 -0
- data/ElizaData/responses/i_agree.res +1 -0
- data/ElizaData/responses/i_am_listening_to_you.res +1 -0
- data/ElizaData/responses/please_explain.res +1 -0
- data/ElizaData/responses/thank_you.res +1 -0
- data/ElizaData/tiny.dict +211 -0
- data/ElizaData/words/adjectives1.words +906 -0
- data/ElizaData/words/adjectives2w.words +1 -0
- data/ElizaData/words/noun0.words +15 -0
- data/ElizaData/words/noun1.words +1391 -0
- data/ElizaData/words/noun2.words +1924 -0
- data/ElizaData/words/noun4.words +330 -0
- data/ElizaData/words/pronoun1.words +6 -0
- data/ElizaData/words/verb4.words +350 -0
- data/ElizaData/words/verb42.words +391 -0
- data/ElizaData/words/verb42w.words +1 -0
- data/ElizaData/words/verb43.words +402 -0
- data/ElizaData/words/verb43w.words +1 -0
- data/ElizaData/words/verb45.words +452 -0
- data/ElizaData/words/verb4w.words +1 -0
- data/ElizaData/words/verb5.words +13 -0
- data/ElizaData/words/verb61.words +35 -0
- data/ElizaData/words/verb62.words +41 -0
- data/ElizaData/words/verb83.words +17 -0
- data/Readme.txt +462 -0
- data/bin/rwdeliza +19 -0
- data/code/01rwdcore/01rwdcore.rb +29 -0
- data/code/01rwdcore/02helptexthashbegin.rb +4 -0
- data/code/01rwdcore/03helptexthash.rb +23 -0
- data/code/01rwdcore/04helptextend.rb +6 -0
- data/code/01rwdcore/jumplinkcommand.rb +26 -0
- data/code/01rwdcore/openhelpwindow.rb +31 -0
- data/code/01rwdcore/returntomain.rb +10 -0
- data/code/01rwdcore/rundocuments.rb +10 -0
- data/code/01rwdcore/runeditconfiguration.rb +10 -0
- data/code/01rwdcore/runhelpabout.rb +10 -0
- data/code/01rwdcore/runopentinkerdocument.rb +7 -0
- data/code/01rwdcore/rwdtinkerversion.rb +22 -0
- data/code/01rwdcore/rwdwindowreturn.rb +9 -0
- data/code/01rwdcore/selectiontab.rb +9 -0
- data/code/01rwdcore/setuphelpaboutoptions.rb +13 -0
- data/code/01rwdcore/setuptinkerdocuments.rb +6 -0
- data/code/01rwdcore/test_cases.rb +109 -0
- data/code/01rwdcore/test_harness.rb +13 -0
- data/code/01rwdcore/uploadreturns.rb +62 -0
- data/code/dd0viewphoto/dd0viewphoto.rb +3 -0
- data/code/superant.com.rwdeliza/0uninstallapplet.rb +10 -0
- data/code/superant.com.rwdeliza/eliza01.rb +45 -0
- data/code/superant.com.rwdeliza/helptexthashrwdeliza.rb +39 -0
- data/code/superant.com.rwdeliza/openhelpwindowrwdeliza.rb +23 -0
- data/code/superant.com.rwdeliza/runrwdshellwindow.rb +12 -0
- data/code/superant.com.rwdeliza/rwdtinkerversion.rb +10 -0
- data/code/superant.com.rwdeliza/tagsentence.rb +39 -0
- data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +61 -0
- data/code/superant.com.rwdtinkerbackwindow/initiateapplets.rb +240 -0
- data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +34 -0
- data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +20 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +12 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +53 -0
- data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +12 -0
- data/code/superant.com.rwdtinkerbackwindow/listzips.rb +27 -0
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +22 -0
- data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +14 -0
- data/code/superant.com.rwdtinkerbackwindow/network.rb +87 -0
- data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +38 -0
- data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +24 -0
- data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +46 -0
- data/code/superant.com.rwdtinkerbackwindow/removeappletvariables.rb +52 -0
- data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +11 -0
- data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +15 -0
- data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +13 -0
- data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +22 -0
- data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +24 -0
- data/code/superant.com.words/dictlookup.rb +20 -0
- data/code/superant.com.words/runfortunewindow.rb +14 -0
- data/code/superant.com.words/runrwdwordsbackwindow.rb +10 -0
- data/code/superant.com.words/runrwdwordsversion.rb +14 -0
- data/code/superant.com.words/rwdtinkerversion.rb +10 -0
- data/code/zz0applicationend/zz0end.rb +4 -0
- data/configuration/language.dist +8 -0
- data/configuration/rwdapplicationidentity.dist +3 -0
- data/configuration/rwdtinker.dist +18 -0
- data/configuration/rwdweliza-0.03.dist +31 -0
- data/configuration/tinkerwin2variables.dist +17 -0
- data/gui/00coreguibegin/applicationguitop.rwd +4 -0
- data/gui/frontwindow0/cc0openphoto.rwd +22 -0
- data/gui/frontwindowselections/00selectiontabbegin.rwd +11 -0
- data/gui/frontwindowselections/jumplinkcommands.rwd +15 -0
- data/gui/frontwindowselections/wwselectionend.rwd +3 -0
- data/gui/frontwindowtdocuments/00documentbegin.rwd +6 -0
- data/gui/frontwindowtdocuments/tinkerdocuments.rwd +14 -0
- data/gui/frontwindowtdocuments/zzdocumentend.rwd +8 -0
- data/gui/helpaboutbegin/zzzrwdlasttab.rwd +6 -0
- data/gui/helpaboutbegin/zzzzhelpscreenstart.rwd +3 -0
- data/gui/helpaboutbegin/zzzzzzhelpabouttab.rwd +15 -0
- data/gui/helpaboutzend/helpscreenend.rwd +3 -0
- data/gui/helpaboutzend/zhelpscreenstart2.rwd +3 -0
- data/gui/helpaboutzend/zzzzhelpabout2.rwd +15 -0
- data/gui/helpaboutzend/zzzzhelpscreen2end.rwd +3 -0
- data/gui/tinkerbackwindows/superant.com.refreshwindow/fortunerefreshwindowtwo.rwd +9 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/1eliza.rwd +21 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/4sentance.rwd +21 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/98jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.rwdeliza/zbackend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/20downloadftp.rwd +45 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/67viewconfiguration.rwd +29 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/70rwddiagnostics.rwd +16 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/m01menubegin.rwd +18 -0
- data/gui/tinkerbackwindows/superant.com.rwdschedulebackwindow/zvbackend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/1appname.rwd +5 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +41 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +44 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/50rwdlistapplets.rwd +44 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/60editconfiguration.rwd +30 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/70rwddiagnostics.rwd +29 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/9backend.rwd +6 -0
- data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/1appname.rwd +31 -0
- data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/9end.rwd +4 -0
- data/gui/tinkerbackwindows/superant.com.versionwindow/1appname.rwd +19 -0
- data/gui/tinkerbackwindows/superant.com.versionwindow/helpaboutwindow.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.words/1appname.rwd +4 -0
- data/gui/tinkerbackwindows/superant.com.words/1dictionary.rwd +19 -0
- data/gui/tinkerbackwindows/superant.com.words/3rwdfortune.rwd +14 -0
- data/gui/tinkerbackwindows/superant.com.words/77jumplinkcommands.rwd +17 -0
- data/gui/tinkerbackwindows/superant.com.words/z9end.rwd +6 -0
- data/gui/zzcoreguiend/yy9rwdend.rwd +4 -0
- data/init.rb +277 -0
- data/installed/rwdweliza-0.03.inf +24 -0
- data/installed/temp.rb +1 -0
- data/lang/en/rwdcore/languagefile.rb +58 -0
- data/lang/es/rwdcore/languagefile-es.rb +62 -0
- data/lang/fr/rwdcore/languagefile.rb +64 -0
- data/lang/jp/rwdcore/languagefile.rb +72 -0
- data/lang/nl/rwdcore/languagefile.rb +75 -0
- data/lib/dict.rb +438 -0
- data/lib/druida.rb +499 -0
- data/lib/hashslice.rb +71 -0
- data/lib/linguistics.rb +360 -0
- data/lib/linguistics/en.rb +1601 -0
- data/lib/linguistics/en/infinitive.rb +1148 -0
- data/lib/linguistics/en/linkparser.rb +142 -0
- data/lib/linguistics/en/wordnet.rb +253 -0
- data/lib/linguistics/iso639.rb +456 -0
- data/lib/linkparser.rb +461 -0
- data/lib/linkparser/connection.rb +81 -0
- data/lib/linkparser/connector.rb +201 -0
- data/lib/linkparser/definition.rb +225 -0
- data/lib/linkparser/dictionary.rb +208 -0
- data/lib/linkparser/linkage.rb +185 -0
- data/lib/linkparser/log.rb +39 -0
- data/lib/linkparser/sentence.rb +79 -0
- data/lib/linkparser/utils.rb +540 -0
- data/lib/linkparser/word.rb +92 -0
- data/lib/rconftool.rb +380 -0
- data/lib/rwd/browser.rb +123 -0
- data/lib/rwd/ftools.rb +174 -0
- data/lib/rwd/mime.rb +328 -0
- data/lib/rwd/net.rb +866 -0
- data/lib/rwd/ruby.rb +889 -0
- data/lib/rwd/rwd.rb +1942 -0
- data/lib/rwd/sgml.rb +236 -0
- data/lib/rwd/thread.rb +63 -0
- data/lib/rwd/tree.rb +371 -0
- data/lib/rwd/xml.rb +101 -0
- data/lib/zip/ioextras.rb +114 -0
- data/lib/zip/stdrubyext.rb +111 -0
- data/lib/zip/tempfile_bugfixed.rb +195 -0
- data/lib/zip/zip.rb +1378 -0
- data/lib/zip/zipfilesystem.rb +558 -0
- data/lib/zip/ziprequire.rb +61 -0
- data/rwd_files/HowTo_Eliza.txt +195 -0
- data/rwd_files/HowTo_Tinker.txt +471 -0
- data/rwd_files/HowTo_TinkerWin2.txt +202 -0
- data/rwd_files/Readme.txt +57 -0
- data/rwd_files/RubyWebDialogs.html +6 -0
- data/rwd_files/favicon.ico +0 -0
- data/rwd_files/rdoc-style.css +175 -0
- data/rwd_files/rwdapplications.html +54 -0
- data/rwd_files/tinker.png +0 -0
- data/rwdconfig.dist +21 -0
- data/rwdeliza.rb +1 -0
- data/tests/RubyGauge.rb +179 -0
- data/tests/checkdepends.sh +4 -0
- data/tests/cleancnf.sh +6 -0
- data/tests/makedist-rwdweliza.rb +56 -0
- data/tests/makedist.rb +66 -0
- data/tests/rdep.rb +354 -0
- data/tests/totranslate.lang +93 -0
- data/zips/rwdwaddresses-1.05.zip +0 -0
- data/zips/rwdwcalc-0.61.zip +0 -0
- data/zips/rwdwgutenberg-0.09.zip +0 -0
- data/zips/rwdwschedule-1.04.zip +0 -0
- data/zips/rwdwshell-1.04.zip +0 -0
- data/zips/temp.rb +1 -0
- data/zips/wrubyslippers-1.06.zip +0 -0
- metadata +282 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
#
|
|
3
|
+
# connection.rb - this file contains the class declarations for the
|
|
4
|
+
# LinkParser::Connection class.
|
|
5
|
+
#
|
|
6
|
+
# == Synopsis
|
|
7
|
+
#
|
|
8
|
+
#
|
|
9
|
+
# == Rcsid
|
|
10
|
+
#
|
|
11
|
+
# $Id: connection.rb,v 1.3 2003/06/08 03:53:27 stillflame Exp $
|
|
12
|
+
#
|
|
13
|
+
# == Authors
|
|
14
|
+
#
|
|
15
|
+
# Martin Chase <stillflame@FaerieMUD.org>
|
|
16
|
+
#
|
|
17
|
+
#:include: COPYRIGHT
|
|
18
|
+
#
|
|
19
|
+
#---
|
|
20
|
+
#
|
|
21
|
+
# Please see the file COPYRIGHT for licensing details.
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
class LinkParser
|
|
25
|
+
class Connection
|
|
26
|
+
include Comparable
|
|
27
|
+
|
|
28
|
+
def initialize( conn1, conn2, lword, rword )
|
|
29
|
+
raise( ParseError::new( "A connection cannot be formed between two words that do not match: %s and %s" %
|
|
30
|
+
[ conn1, conn2 ]) ) unless
|
|
31
|
+
conn1.match(conn2)
|
|
32
|
+
@name, @subName = conn1.generalize(conn2)
|
|
33
|
+
@lword = lword
|
|
34
|
+
@rword = rword
|
|
35
|
+
@length = rword.position - lword.position
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# the major name of the link
|
|
39
|
+
attr_reader :name
|
|
40
|
+
|
|
41
|
+
# the minor name of the link
|
|
42
|
+
attr_reader :subName
|
|
43
|
+
|
|
44
|
+
# the index of the word connected to this link on the left
|
|
45
|
+
attr_reader :lword
|
|
46
|
+
|
|
47
|
+
# the index of the word connected to this link on the right
|
|
48
|
+
attr_reader :rword
|
|
49
|
+
|
|
50
|
+
# the number of words spanned by this connection
|
|
51
|
+
attr_reader :length
|
|
52
|
+
|
|
53
|
+
# Hash on the important part - the name and subname.
|
|
54
|
+
def hash
|
|
55
|
+
[@name, @subName].hash
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Provide a consistent basis for sorting connections within a linkage to
|
|
59
|
+
# allow two linkages to be compared.
|
|
60
|
+
def <=>(other)
|
|
61
|
+
pos = self.lword.position <=> other.lword.position
|
|
62
|
+
return pos if pos.nonzero?
|
|
63
|
+
len = self.length <=> other.length
|
|
64
|
+
return len if len.nonzero?
|
|
65
|
+
return self.to_s <=> other.to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Equality based only on the name and subname.
|
|
69
|
+
def eql?(o)
|
|
70
|
+
@name == o.name &&
|
|
71
|
+
@subName == o.subName &&
|
|
72
|
+
@length == o.length
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Stringification delegated to the @general connector.
|
|
76
|
+
def to_s
|
|
77
|
+
@name + @subName
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end # class Connection
|
|
81
|
+
end # class LinkParser
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#~/usr/bin/ruby
|
|
2
|
+
#
|
|
3
|
+
# connector.rb - this file contains the Connector class. This describes the
|
|
4
|
+
# behavior of an un-linked link, as they exist in the Definition of a word.
|
|
5
|
+
#
|
|
6
|
+
# == Synopsis
|
|
7
|
+
#
|
|
8
|
+
#
|
|
9
|
+
# == Rcsid
|
|
10
|
+
#
|
|
11
|
+
# $Id: connector.rb,v 1.5 2003/05/18 19:26:06 stillflame Exp $
|
|
12
|
+
#
|
|
13
|
+
# == Authors
|
|
14
|
+
#
|
|
15
|
+
# Martin Chase <stillflame@FaerieMUD.org>
|
|
16
|
+
#
|
|
17
|
+
#:include: COPYRIGHT
|
|
18
|
+
#
|
|
19
|
+
#---
|
|
20
|
+
#
|
|
21
|
+
# Please see the file COPYRIGHT for licensing details.
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
class LinkParser
|
|
25
|
+
class Connector
|
|
26
|
+
|
|
27
|
+
LEFT = 'l' # left side
|
|
28
|
+
RIGHT = 'r' # right side
|
|
29
|
+
BOTH = '*' # both sides
|
|
30
|
+
n = 1.0/0.0
|
|
31
|
+
ONCE = 1..1 # matches once
|
|
32
|
+
OPTIONAL = 0..1 # matches zero or one times
|
|
33
|
+
PLUS = 1..n # matches one or more times
|
|
34
|
+
STAR = 0..n # matches zero or more times
|
|
35
|
+
# The names 'star' and 'plus' are taken from regexen.
|
|
36
|
+
@@connectors = []
|
|
37
|
+
|
|
38
|
+
# Creates and returns a connector. Creation only happens once for each
|
|
39
|
+
# unique set of arguments.
|
|
40
|
+
# name - major name of the connector ('A','AA','P*',&c.)
|
|
41
|
+
# subName - minor name of the connector ('s' or 'p*x' from 'MVs' or
|
|
42
|
+
# 'MVp*x', respectively)
|
|
43
|
+
# side - which side the connector accepts from
|
|
44
|
+
# multiplicity - the number of connections required to satisfy this
|
|
45
|
+
# connector.
|
|
46
|
+
def Connector.new( name, subName='', side=BOTH, multiplicity=ONCE, cost=0 )
|
|
47
|
+
subName = '' unless subName
|
|
48
|
+
connector = super(name,subName,side,multiplicity,cost)
|
|
49
|
+
if(already = (@@connectors.find {|c| c.eql? connector}))
|
|
50
|
+
return already
|
|
51
|
+
else
|
|
52
|
+
@@connectors << connector
|
|
53
|
+
return connector
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Initializes a new Connector object.
|
|
58
|
+
def initialize( name, subName, side, multiplicity, cost )
|
|
59
|
+
@name = name
|
|
60
|
+
@subName = subName
|
|
61
|
+
@side = side
|
|
62
|
+
@multiplicity = multiplicity
|
|
63
|
+
@cost = cost
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# The name of the connector.
|
|
67
|
+
attr_reader :name
|
|
68
|
+
|
|
69
|
+
# The sub name of the connector, if any.
|
|
70
|
+
attr_reader :subName
|
|
71
|
+
|
|
72
|
+
# The linking cost of the connector.
|
|
73
|
+
attr_reader :cost
|
|
74
|
+
|
|
75
|
+
# How many connections it takes to satisfy this connector.
|
|
76
|
+
attr_reader :multiplicity
|
|
77
|
+
|
|
78
|
+
# Whether or not the connector is optional.
|
|
79
|
+
def optional?
|
|
80
|
+
@multiplicity === 0
|
|
81
|
+
end
|
|
82
|
+
alias :optional :optional?
|
|
83
|
+
|
|
84
|
+
# Whether or not the connector accepts multiple connections.
|
|
85
|
+
def multiple?
|
|
86
|
+
@multiplicity === 2
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Which side the connector links to (LEFT, RIGHT or BOTH).
|
|
90
|
+
attr_reader :side
|
|
91
|
+
|
|
92
|
+
# Whether or not the connector links to the LEFT.
|
|
93
|
+
def left?
|
|
94
|
+
@side == LEFT or @side == BOTH
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Whether or not the connector links to the RIGHT.
|
|
98
|
+
def right?
|
|
99
|
+
@side == RIGHT or @side == BOTH
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Whether or not the connector links to both sides
|
|
103
|
+
def both?
|
|
104
|
+
@side == BOTH
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Returns self
|
|
108
|
+
def dup
|
|
109
|
+
self
|
|
110
|
+
end
|
|
111
|
+
alias :clone :dup
|
|
112
|
+
|
|
113
|
+
# Returns a simple stringy representation
|
|
114
|
+
def to_s
|
|
115
|
+
result = @name + @subName
|
|
116
|
+
result = "@" + result if self.multiple?
|
|
117
|
+
result += (@side == LEFT ? "-" : "+") unless @side == BOTH
|
|
118
|
+
result += "(#{@cost})" if self.cost.nonzero?
|
|
119
|
+
result = "{" + result + "}" if self.optional?
|
|
120
|
+
return result
|
|
121
|
+
end
|
|
122
|
+
alias :inspect :to_s
|
|
123
|
+
|
|
124
|
+
# Checks to see if the two connectors can match. rules for matching:
|
|
125
|
+
# 1: a '*' matches any character
|
|
126
|
+
# 2: a '^' matches only the '*' character
|
|
127
|
+
# 3: a 'a' matches either a 'a' or a '*' (for any character 'a-Z')
|
|
128
|
+
# 4: a Connector is considered to be followed by an infinite number of
|
|
129
|
+
# '*'s
|
|
130
|
+
def match(other)
|
|
131
|
+
return false unless (@side != other.side ||
|
|
132
|
+
@side == BOTH)
|
|
133
|
+
i = 0
|
|
134
|
+
while( i <= @name.length && i <= other.name.length )
|
|
135
|
+
return( false ) unless ( @name[i] == '*'[0] ||
|
|
136
|
+
other.name[i] == '*'[0] ||
|
|
137
|
+
( (@name[i] == other.name[i]) &&
|
|
138
|
+
(@name[i] != '^'[0]) ) ||
|
|
139
|
+
(@name[i].nil? || other.name[i].nil?) )
|
|
140
|
+
i += 1
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
i = 0
|
|
144
|
+
while( i <= @subName.length && i <= other.subName.length )
|
|
145
|
+
return( false ) unless ( @subName[i] == '*'[0] ||
|
|
146
|
+
other.subName[i] == '*'[0] ||
|
|
147
|
+
( (@subName[i] == other.subName[i]) &&
|
|
148
|
+
(@subName[i] != '^'[0]) ) ||
|
|
149
|
+
(@subName[i].nil? || other.subName[i].nil? ) )
|
|
150
|
+
i += 1
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
return true
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Generalizes this connector with the given other connector in a
|
|
157
|
+
# position-based comparison according to the following rules:
|
|
158
|
+
# Names are compared separately from subNames.
|
|
159
|
+
# Matching characters: left the same.
|
|
160
|
+
# '*' and any character: becomes a '*'.
|
|
161
|
+
# '^' matches only the '*' character
|
|
162
|
+
# Non-matching characters: turned into a '*'.
|
|
163
|
+
def generalize(other)
|
|
164
|
+
name = @name
|
|
165
|
+
subName = @subName
|
|
166
|
+
|
|
167
|
+
i = 0
|
|
168
|
+
while( i < name.length && i < other.name.length )
|
|
169
|
+
name[i] = '*' if name[i] != other.name[i] or
|
|
170
|
+
name[i,1] == '*' or other.name[i,1] == '*'
|
|
171
|
+
i += 1
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
if other.subName.empty?
|
|
175
|
+
subName = '*' * subName.length
|
|
176
|
+
elsif subName.empty?
|
|
177
|
+
subName = '*' * other.subName.length
|
|
178
|
+
else
|
|
179
|
+
i = 0
|
|
180
|
+
while( i < subName.length && i < other.subName.length )
|
|
181
|
+
subName[i] = '*' unless subName[i] == other.subName[i]
|
|
182
|
+
i += 1
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
return [name,subName]
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Tests for equality by value.
|
|
190
|
+
def eql?(other)
|
|
191
|
+
@name == other.name and
|
|
192
|
+
@subName == other.subName and
|
|
193
|
+
@cost == other.cost and
|
|
194
|
+
@multiplicity == other.multiplicity and
|
|
195
|
+
@side == other.side
|
|
196
|
+
end
|
|
197
|
+
alias :equal? :eql?;
|
|
198
|
+
alias :== :eql?;
|
|
199
|
+
|
|
200
|
+
end # class Connector
|
|
201
|
+
end # module LinkParser
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/ruby
|
|
2
|
+
#
|
|
3
|
+
# definition.rb - contains the Definition class, a class the encompasses the
|
|
4
|
+
# way a word is defined in link grammar: a set of sets of connectors with
|
|
5
|
+
# sidedness.
|
|
6
|
+
#
|
|
7
|
+
# == Synopsis
|
|
8
|
+
#
|
|
9
|
+
#
|
|
10
|
+
# == Rcsid
|
|
11
|
+
#
|
|
12
|
+
# $Id: definition.rb,v 1.5 2003/05/15 01:51:32 stillflame Exp $
|
|
13
|
+
#
|
|
14
|
+
# == Authors
|
|
15
|
+
#
|
|
16
|
+
# Martin Chase <stillflame@FaerieMUD.org>
|
|
17
|
+
#
|
|
18
|
+
#:include: COPYRIGHT
|
|
19
|
+
#
|
|
20
|
+
#---
|
|
21
|
+
#
|
|
22
|
+
# Please see the file COPYRIGHT for licensing details.
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
#require "linkparser/log"
|
|
26
|
+
require "linkparser/utils"
|
|
27
|
+
require "linkparser/connector"
|
|
28
|
+
|
|
29
|
+
require "strscan"
|
|
30
|
+
require "forwardable"
|
|
31
|
+
|
|
32
|
+
class LinkParser
|
|
33
|
+
|
|
34
|
+
class Definition
|
|
35
|
+
|
|
36
|
+
# Constants for definition parsing.
|
|
37
|
+
Token = /\s+|@?[A-Z*^]+[a-z^*]*[+-]|\(|\[|\{|\)|\]|\}|[Aa][Nn][Dd]|&|[Oo][Rr]|\|/
|
|
38
|
+
Connect = /(@)?([A-Z*^]+[a-z^*]*)([+-])/
|
|
39
|
+
Conjunction = /(and)|(&)|(or)|(\|)/i
|
|
40
|
+
Open = /\(|\[|\{/
|
|
41
|
+
Close = /\)|\]|\}/
|
|
42
|
+
Space = /\s+/
|
|
43
|
+
|
|
44
|
+
# Takes a definition string and returns a Definition object populated
|
|
45
|
+
# with the set of sets of connectors that will satisfy that the provided
|
|
46
|
+
# string.
|
|
47
|
+
# args:
|
|
48
|
+
# definition - the string to be parsed for meaning, or a
|
|
49
|
+
# StringScanner on that string, possibly in mid-parse
|
|
50
|
+
def Definition.satisfy( definition )
|
|
51
|
+
Definition::new(Definition::re_satisfy(definition))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# The main body of satisfy,
|
|
55
|
+
def Definition.re_satisfy(definition)
|
|
56
|
+
definition = StringScanner.new( definition, false ) unless
|
|
57
|
+
definition.kind_of?(StringScanner)
|
|
58
|
+
results = []
|
|
59
|
+
side = nil
|
|
60
|
+
current = nil
|
|
61
|
+
multi = false
|
|
62
|
+
|
|
63
|
+
while definition.rest?
|
|
64
|
+
case current = definition.scan(Token)
|
|
65
|
+
when Connect
|
|
66
|
+
# Connectors - puts the connector alone in a set, and
|
|
67
|
+
# puts that into the results.
|
|
68
|
+
connector_m = Connect.match( current )
|
|
69
|
+
side = connector_m[3] =~ /-/ ? Connector::LEFT : Connector::RIGHT
|
|
70
|
+
multi = connector_m[1] ? Connector::PLUS : Connector::ONCE
|
|
71
|
+
name_scan = StringScanner::new(connector_m[2])
|
|
72
|
+
# Slurp in all the characters up to the last capitol
|
|
73
|
+
# letter and up to one star or caret.
|
|
74
|
+
name = name_scan.scan(/.*[A-Z][*^]?/)
|
|
75
|
+
sub_name = name_scan.rest or ''
|
|
76
|
+
# Log.debug( "Found connector '%s'" % current )
|
|
77
|
+
results << [ Connector::new(name, sub_name, side, multi) ]
|
|
78
|
+
when Conjunction
|
|
79
|
+
# Conjunctions (and, or) - combine the results so far with the
|
|
80
|
+
# results of what would be the rest of the parse, as per the
|
|
81
|
+
# rules of the conjunction used.
|
|
82
|
+
conj_m = Conjunction.match( current )
|
|
83
|
+
raise ParseError, "conjunction with nothing preceeding it: '#{definition.string}'" if
|
|
84
|
+
results.empty?
|
|
85
|
+
if conj_m[1] or conj_m[2]
|
|
86
|
+
# and, & - the new results will be every combination of the
|
|
87
|
+
# previous results and the results of the rest of the parse.
|
|
88
|
+
rest = re_satisfy(definition)
|
|
89
|
+
raise ParseError, "conjunction with nothing following: '#{definition.string}'" if
|
|
90
|
+
rest.empty?
|
|
91
|
+
results.combine!(rest)
|
|
92
|
+
else
|
|
93
|
+
# or, | - the new results will be the union of the previous
|
|
94
|
+
# results and the results of the rest of the parse.
|
|
95
|
+
rest = re_satisfy(definition)
|
|
96
|
+
raise ParseError, "conjunction with nothing following: '#{definition.string}'" if
|
|
97
|
+
rest.empty?
|
|
98
|
+
results.add!(rest)
|
|
99
|
+
end
|
|
100
|
+
return results
|
|
101
|
+
when Open
|
|
102
|
+
# Open parens - treated the same as a single connector, but
|
|
103
|
+
# concerning the entire contents of the parens.
|
|
104
|
+
if current =~ /\[/
|
|
105
|
+
re_satisfy( definition ).each {|set|
|
|
106
|
+
set.map! {|conn|
|
|
107
|
+
Connector.new(conn.name,conn.subName,conn.side,conn.multiplicity,conn.cost+1)
|
|
108
|
+
}
|
|
109
|
+
results << set
|
|
110
|
+
}
|
|
111
|
+
elsif current =~ /\{/
|
|
112
|
+
re_satisfy( definition ).each {|set|
|
|
113
|
+
set.map! {|conn|
|
|
114
|
+
if conn.multiplicity == Connector::ONCE
|
|
115
|
+
Connector.new(conn.name,conn.subName,conn.side,Connector::OPTIONAL,conn.cost)
|
|
116
|
+
elsif conn.multiplicity == Connector::PLUS
|
|
117
|
+
Connector.new(conn.name,conn.subName,conn.side,Connector::STAR,conn.cost)
|
|
118
|
+
else
|
|
119
|
+
conn
|
|
120
|
+
end
|
|
121
|
+
}
|
|
122
|
+
results << set
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
results.add!(re_satisfy( definition ))
|
|
126
|
+
end
|
|
127
|
+
raise ParseError, "improper parentheses usage: '#{definition.string}'" if
|
|
128
|
+
results.empty?
|
|
129
|
+
when Close
|
|
130
|
+
# Close parens - if this is found, the method returns, checking
|
|
131
|
+
# for the null-connector condition first.
|
|
132
|
+
return results.empty? ? [ [Connector::new("*")] ] : results
|
|
133
|
+
when Space
|
|
134
|
+
# Spaces - are ignored
|
|
135
|
+
when nil
|
|
136
|
+
# Nil - means the parse has encountered something not matching
|
|
137
|
+
# the Token regex.
|
|
138
|
+
raise ParseError, "Definition unparsable before end of definition: '#{definition.rest}'"
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
return results
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
extend Forwardable
|
|
146
|
+
|
|
147
|
+
# The single argument may be either a String or an Array. If the
|
|
148
|
+
# argument is a string, it is treated as a definition string, and won't
|
|
149
|
+
# be parsed until needed. If it is an array, no reverse engineering
|
|
150
|
+
# will be done to create the corresponding definition string.
|
|
151
|
+
def initialize( an_arg )
|
|
152
|
+
if an_arg.kind_of? String
|
|
153
|
+
@raw = an_arg
|
|
154
|
+
@connector_sets = []
|
|
155
|
+
else
|
|
156
|
+
@raw = nil
|
|
157
|
+
@connector_sets = an_arg
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# The raw string from which this definition is derived.
|
|
162
|
+
attr_reader :raw
|
|
163
|
+
|
|
164
|
+
# The sets of sets of connectors that is the algorithmicly useful version
|
|
165
|
+
# of this object.
|
|
166
|
+
def connector_sets
|
|
167
|
+
if @connector_sets and @connector_sets.empty?
|
|
168
|
+
@connector_sets = Definition::re_satisfy(@raw)
|
|
169
|
+
else
|
|
170
|
+
@connector_sets
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
alias :connectorSets :connector_sets
|
|
174
|
+
|
|
175
|
+
# Delegate all calls of array-like methods to the connector sets.
|
|
176
|
+
def_delegators :connector_sets, *(Array.instance_methods(false) - %w{to_s inspect ==})
|
|
177
|
+
|
|
178
|
+
# The most sensible stringification of this definition.
|
|
179
|
+
def to_s
|
|
180
|
+
@raw ? @raw : self.to_connectors
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Stringification of the connector sets.
|
|
184
|
+
def to_connectors
|
|
185
|
+
self.connector_sets.inspect
|
|
186
|
+
end
|
|
187
|
+
alias :two_s :to_connectors
|
|
188
|
+
|
|
189
|
+
# Stringification with a 'sensible' opposite of the one for to_s.
|
|
190
|
+
def inspect
|
|
191
|
+
(@connector_sets && @connector_sets.empty?) ? @raw : @connector_sets.inspect
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# tests for equality
|
|
195
|
+
def ==(other)
|
|
196
|
+
return(false) unless
|
|
197
|
+
other.kind_of?(self.class)
|
|
198
|
+
return(@raw == other.raw) if
|
|
199
|
+
(@raw && other.raw) and (@raw == other.raw)
|
|
200
|
+
return self.connector_sets.set_of_sets_equal?(other.connector_sets)
|
|
201
|
+
end
|
|
202
|
+
alias :=== :==;
|
|
203
|
+
alias :eql? :==;
|
|
204
|
+
|
|
205
|
+
# Returns those connector_sets which include a connector which matches the
|
|
206
|
+
# provided connector.
|
|
207
|
+
def sets_matching(connector)
|
|
208
|
+
self.find_all {|set|
|
|
209
|
+
set.find {|c|
|
|
210
|
+
c.match(connector)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Returns whether or not there exists a matching connector to a given connector.
|
|
216
|
+
def includes_match?(connector)
|
|
217
|
+
self.find {|set|
|
|
218
|
+
set.find {|c|
|
|
219
|
+
c.match(connector)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end # class Definition
|
|
225
|
+
end # module LinkParser
|