summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2010-12-03 09:05:05 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2010-12-03 09:05:05 +0000
commite04c6a878f5044d36eaa95d4c2318e0381a32998 (patch)
tree5b7c36578140e48c0114863004c8375ea55db21d /Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h
parentfa438554bd1a061515cd8f5f46fbe311ff08dcd6 (diff)
icu 4.6
git-svn-id: svn://tug.org/texlive/trunk@20645 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h')
-rw-r--r--Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h157
1 files changed, 157 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h b/Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h
new file mode 100644
index 00000000000..7b76f8f2daa
--- /dev/null
+++ b/Build/source/libs/icu/icu-4.6/test/intltest/wbnf.h
@@ -0,0 +1,157 @@
+/*
+ ******************************************************************************
+ * Copyright (C) 2005, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ ******************************************************************************
+ */
+/*
+ WBNF, Weighted BNF, is an extend BNF. The most difference between WBNF
+ and standard BNF is the WBNF accepts weight for its alternation items.
+ The weight specifies the opportunity it will be selected.
+
+ The purpose of WBNF is to help generate a random string from a given grammar
+ which can be described with standard BNF. The introduction of 'weight'
+ is to guide the generator to give the specific parts different chances to be
+ generated.
+
+ Usually, the user gives LanguageGenerator the grammar description in WBNF,
+ then LanguageGenerator will generate a random string on every next() call.
+ The return code of parseBNF() can help user to determine the error,
+ either in the grammar description or in the WBNF parser itself.
+
+
+ The grammar of WBNF itself can be described in standard BNF,
+
+ escaping = _single character with a leading back slash, either inside or outside quoting_
+ quoting = _quoted with a pair of single quotation marks_
+ string = string alphabet | string digit | string quoting | string escaping |
+ alphabet | quoting | escaping
+ alphabet =
+ digit =
+ integer = integer digit | digit
+ weight = integer %
+ weight-list = weight-list weight | weight
+ var = var alphabet | var digit | $ alphabet
+
+ var-defs = var-defs var-def | var-def
+ var-def = var '=' definition;
+
+ alternation = alternation '|' alt-item | alt-item
+ alt-item = sequence | sequence weight
+
+ sequence = sequence modified | modified
+
+ modified = core | morph | quote | repeat
+ morph = modified ~
+ quote = modified @
+ repeat = modified quantifier | modified quantifier weight-list
+ quantifier = ? | * | + | { integer , integer} | {integer, } | {integer}
+
+ core = var | string | '(' definition ')'
+
+ definition = core | modified | sequence | alternation
+ definition = alternation
+
+ Remarks:
+ o Following characters are literals in preceding definition
+ but are syntax symbols in WBNF
+
+ % $ ~ @ ? * + { } ,
+
+ o Following character are syntax symbols in preceding definition
+ (sapce) contact operation, or separators to increase readability
+ = definition
+ | selection operation
+ ( ) precedence select
+ ' ' override special-character to plain character
+
+ o the definition of 'escaping' and 'quoting' are preceding definition text
+ o infinite is actually a predefine value PSEUDO_INFINIT defined in this file
+ o if weight is not presented in "alt-item' and 'repeat',
+ a default weight DEFAULT_WEIGHT defined in this file is used
+
+ o * == {0, }
+ + == {1, }
+ ? == {0, 1}
+
+ o the weight-list for repeat assigns the weights for repeat itmes one by one
+
+ demo{1,3} 30% 40% 100% == (demo)30% | (demodemo)40% | (demodemodemo)100%
+
+ To find more explain of the weight-list, please see the LIMITATION of the grammar
+
+ o but the weight-list for question mark has different meaning
+
+ demo ? 30% != demo{0,1} 30% 100%
+ demo ? 30% == demo{0,1} 70% 30%
+
+ the 70% is calculated from (DEFAULT_WEIGHT - weight)
+
+
+ Known LIMITATION of the grammar
+ For 'repeat', the parser will eat up as much as possible weights at one time,
+ discard superfluous weights if it is too much,
+ fill insufficient weights with default weight if it is too less.
+ This behavior means following definitions are equal
+
+ demo{1,3} 30% 40% 100%
+ demo{1,3} 30% 40% 100% 50%
+ demo{1,3} 30% 40%
+
+ This behavior will cause a little confusion when defining an alternation
+
+ demo{1,3} 30% 40% 100% 50% | show 20%
+
+ is interpreted as
+
+ (demo{1,3} 30% 40% 100%) 100% | show 20%
+
+ not
+
+ (demo{1,3} 30% 40% 100%) 50% | show 20%
+
+ to get an expected definition, please use parentheses.
+
+ Known LIMITATION of current implement
+ Due to the well known point alias problem, current Parser will be effectively
+ crashed if the definition looks like
+
+ $a = demo;
+ $b = $a;
+ $c = $a;
+ or
+ $a = demo;
+ $b = $a $a;
+ or
+ $a = demo;
+ $b = $b $a;
+
+ The crash will occur at delete operation in destructor or other memory release code.
+ Several plans are on hard to fix the problem. Use a smart point with reference count,
+ or use a central memory management solution. But now, it works well with collation
+ monkey test, which is the only user for WBNF.
+*/
+
+#ifndef _WBNF
+#define _WBNF
+
+#include "unicode/utypes.h"
+
+const int DEFAULT_WEIGHT = 100;
+const int PSEUDO_INFINIT = 200;
+
+class LanguageGenerator_impl;
+
+class LanguageGenerator{
+ LanguageGenerator_impl * lang_gen;
+public:
+ enum PARSE_RESULT {OK, BNF_DEF_WRONG, INCOMPLETE, NO_TOP_NODE};
+ LanguageGenerator();
+ ~LanguageGenerator();
+ PARSE_RESULT parseBNF(const char *const bnf_definition /*in*/, const char *const top_node/*in*/, UBool debug=FALSE);
+ const char *next(); /* Return a null-terminated c-string. The buffer is owned by callee. */
+};
+
+void TestWbnf(void);
+
+#endif /* _WBNF */