Added Expression classes to App directory. Added Expression interface to Property base class.
This commit is contained in:
parent
3474419925
commit
722a40dd41
|
@ -95,6 +95,7 @@
|
|||
#include "Placement.h"
|
||||
#include "Plane.h"
|
||||
#include "MaterialObject.h"
|
||||
#include "Expression.h"
|
||||
|
||||
// If you stumble here, run the target "BuildExtractRevision" on Windows systems
|
||||
// or the Python script "SubWCRev.py" on Linux based systems which builds
|
||||
|
@ -1116,6 +1117,18 @@ void Application::initTypes(void)
|
|||
App ::MaterialObjectPython ::init();
|
||||
App ::Placement ::init();
|
||||
App ::Plane ::init();
|
||||
|
||||
// Expression classes
|
||||
App ::Expression ::init();
|
||||
App ::UnitExpression ::init();
|
||||
App ::NumberExpression ::init();
|
||||
App ::ConstantExpression ::init();
|
||||
App ::OperatorExpression ::init();
|
||||
App ::VariableExpression ::init();
|
||||
App ::ConditionalExpression ::init();
|
||||
App ::StringExpression ::init();
|
||||
App ::FunctionExpression ::init();
|
||||
|
||||
}
|
||||
|
||||
void Application::initConfig(int argc, char ** argv)
|
||||
|
|
|
@ -62,6 +62,7 @@ SET(Document_CPP_SRCS
|
|||
DocumentObserver.cpp
|
||||
DocumentObserverPython.cpp
|
||||
DocumentPyImp.cpp
|
||||
Expression.cpp
|
||||
FeaturePython.cpp
|
||||
FeatureTest.cpp
|
||||
GeoFeature.cpp
|
||||
|
@ -83,6 +84,7 @@ SET(Document_HPP_SRCS
|
|||
DocumentObjectGroup.h
|
||||
DocumentObserver.h
|
||||
DocumentObserverPython.h
|
||||
Expression.h
|
||||
FeaturePython.h
|
||||
FeaturePythonPyImp.h
|
||||
FeaturePythonPyImp.inl
|
||||
|
@ -106,6 +108,7 @@ SOURCE_GROUP("Document" FILES ${Document_SRCS})
|
|||
# The property stuff
|
||||
SET(Properties_CPP_SRCS
|
||||
DynamicProperty.cpp
|
||||
ObjectIdentifier.cpp
|
||||
Property.cpp
|
||||
PropertyContainer.cpp
|
||||
PropertyContainerPyImp.cpp
|
||||
|
@ -118,6 +121,7 @@ SET(Properties_CPP_SRCS
|
|||
)
|
||||
SET(Properties_HPP_SRCS
|
||||
DynamicProperty.h
|
||||
ObjectIdentifier.h
|
||||
Property.h
|
||||
PropertyContainer.h
|
||||
PropertyFile.h
|
||||
|
|
1448
src/App/Expression.cpp
Normal file
1448
src/App/Expression.cpp
Normal file
File diff suppressed because it is too large
Load Diff
433
src/App/Expression.h
Normal file
433
src/App/Expression.h
Normal file
|
@ -0,0 +1,433 @@
|
|||
/***************************************************************************
|
||||
* Copyright (c) Eivind Kvedalen (eivind@kvedalen.name) 2015 *
|
||||
* *
|
||||
* This file is part of the FreeCAD CAx development system. *
|
||||
* *
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU Library General Public *
|
||||
* License as published by the Free Software Foundation; either *
|
||||
* version 2 of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This library is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Library General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Library General Public *
|
||||
* License along with this library; see the file COPYING.LIB. If not, *
|
||||
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
||||
* Suite 330, Boston, MA 02111-1307, USA *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef EXPRESSION_H
|
||||
#define EXPRESSION_H
|
||||
|
||||
#include <string>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <Base/Exception.h>
|
||||
#include <Base/Unit.h>
|
||||
#include <App/Property.h>
|
||||
#include <App/ObjectIdentifier.h>
|
||||
#include <Base/BaseClass.h>
|
||||
#include <Base/Quantity.h>
|
||||
#include <set>
|
||||
#include <deque>
|
||||
|
||||
namespace App {
|
||||
|
||||
class DocumentObject;
|
||||
class Expression;
|
||||
class Document;
|
||||
|
||||
class AppExport ExpressionVisitor {
|
||||
public:
|
||||
virtual ~ExpressionVisitor() {}
|
||||
virtual void visit(Expression * e) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Base class for expressions.
|
||||
*
|
||||
*/
|
||||
|
||||
class AppExport Expression : public Base::BaseClass {
|
||||
TYPESYSTEM_HEADER();
|
||||
|
||||
public:
|
||||
|
||||
Expression(const App::DocumentObject * _owner);
|
||||
|
||||
virtual ~Expression();
|
||||
|
||||
virtual bool isTouched() const { return false; }
|
||||
|
||||
virtual Expression * eval() const = 0;
|
||||
|
||||
virtual std::string toString() const = 0;
|
||||
|
||||
static Expression * parse(const App::DocumentObject * owner, const std::string& buffer);
|
||||
|
||||
virtual Expression * copy() const = 0;
|
||||
|
||||
virtual int priority() const { return 0; }
|
||||
|
||||
virtual void getDeps(std::set<ObjectIdentifier> &props) const { }
|
||||
|
||||
virtual Expression * simplify() const = 0;
|
||||
|
||||
virtual void visit(ExpressionVisitor & v) { v.visit(this); }
|
||||
|
||||
class Exception : public Base::Exception {
|
||||
public:
|
||||
Exception(const char *sMessage) : Base::Exception(sMessage) { }
|
||||
};
|
||||
|
||||
const App::DocumentObject * getOwner() const { return owner; }
|
||||
|
||||
virtual boost::any getValueAsAny() const { static boost::any empty; return empty; }
|
||||
|
||||
protected:
|
||||
const App::DocumentObject * owner; /**< The document object used to access unqualified variables (i.e local scope) */
|
||||
};
|
||||
|
||||
/**
|
||||
* Part of an expressions that contains a unit.
|
||||
*
|
||||
*/
|
||||
|
||||
class AppExport UnitExpression : public Expression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
UnitExpression(const App::DocumentObject *_owner = 0, const Base::Quantity & _quantity = Base::Quantity(), const std::string & _unitStr = std::string());
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
void setUnit(const Base::Quantity &_quantity);
|
||||
|
||||
double getValue() const { return quantity.getValue(); }
|
||||
|
||||
const Base::Unit & getUnit() const { return quantity.getUnit(); }
|
||||
|
||||
const Base::Quantity & getQuantity() const { return quantity; }
|
||||
|
||||
const std::string getUnitString() const { return unitStr; }
|
||||
|
||||
double getScaler() const { return quantity.getValue(); }
|
||||
|
||||
boost::any getValueAsAny() const { return quantity.getUnit().isEmpty() ? boost::any(quantity.getValue()) : boost::any(quantity); }
|
||||
|
||||
protected:
|
||||
Base::Quantity quantity;
|
||||
std::string unitStr; /**< The unit string from the original parsed string */
|
||||
};
|
||||
|
||||
/**
|
||||
* Class implementing a number with an optional unit
|
||||
*/
|
||||
|
||||
class AppExport NumberExpression : public UnitExpression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
NumberExpression(const App::DocumentObject *_owner = 0, const Base::Quantity & quantity = Base::Quantity());
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
void negate();
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
class AppExport ConstantExpression : public NumberExpression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
ConstantExpression(const App::DocumentObject *_owner = 0, std::string _name = "", const Base::Quantity &_quantity = Base::Quantity());
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
std::string getName() const { return name; }
|
||||
|
||||
protected:
|
||||
std::string name; /**< Constant's name */
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Class implementing an infix expression.
|
||||
*
|
||||
*/
|
||||
|
||||
class AppExport OperatorExpression : public UnitExpression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
enum Operator {
|
||||
NONE,
|
||||
ADD,
|
||||
SUB,
|
||||
MUL,
|
||||
DIV,
|
||||
POW,
|
||||
EQ,
|
||||
NEQ,
|
||||
LT,
|
||||
GT,
|
||||
LTE,
|
||||
GTE,
|
||||
UNIT,
|
||||
NEG,
|
||||
POS
|
||||
};
|
||||
OperatorExpression(const App::DocumentObject *_owner = 0, Expression * _left = 0, Operator _op = NONE, Expression * _right = 0);
|
||||
|
||||
virtual ~OperatorExpression();
|
||||
|
||||
virtual bool isTouched() const;
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const;
|
||||
|
||||
virtual void getDeps(std::set<ObjectIdentifier> &props) const;
|
||||
|
||||
virtual void visit(ExpressionVisitor & v);
|
||||
|
||||
protected:
|
||||
Operator op; /**< Operator working on left and right */
|
||||
Expression * left; /**< Left operand */
|
||||
Expression * right; /**< Right operand */
|
||||
};
|
||||
|
||||
class AppExport ConditionalExpression : public Expression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
ConditionalExpression(const App::DocumentObject *_owner = 0, Expression * _condition = 0,Expression * _trueExpr = 0, Expression * _falseExpr = 0);
|
||||
|
||||
virtual ~ConditionalExpression();
|
||||
|
||||
virtual bool isTouched() const;
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const;
|
||||
|
||||
virtual void getDeps(std::set<ObjectIdentifier> &props) const;
|
||||
|
||||
virtual void visit(ExpressionVisitor & v);
|
||||
|
||||
protected:
|
||||
|
||||
Expression * condition; /**< Condition */
|
||||
Expression * trueExpr; /**< Expression if abs(condition) is > 0.5 */
|
||||
Expression * falseExpr; /**< Expression if abs(condition) is < 0.5 */
|
||||
};
|
||||
|
||||
/**
|
||||
* Class implementing various functions, e.g sin, cos, etc.
|
||||
*
|
||||
*/
|
||||
|
||||
class AppExport FunctionExpression : public UnitExpression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
enum Function {
|
||||
NONE,
|
||||
|
||||
// Normal functions taking one or two arguments
|
||||
ACOS,
|
||||
ASIN,
|
||||
ATAN,
|
||||
ABS,
|
||||
EXP,
|
||||
LOG,
|
||||
LOG10,
|
||||
SIN,
|
||||
SINH,
|
||||
TAN,
|
||||
TANH,
|
||||
SQRT,
|
||||
COS,
|
||||
COSH,
|
||||
ATAN2,
|
||||
MOD,
|
||||
POW,
|
||||
ROUND,
|
||||
TRUNC,
|
||||
CEIL,
|
||||
FLOOR,
|
||||
LAST,
|
||||
};
|
||||
|
||||
FunctionExpression(const App::DocumentObject *_owner = 0, Function _f = NONE, std::vector<Expression *> _args = std::vector<Expression*>());
|
||||
|
||||
virtual ~FunctionExpression();
|
||||
|
||||
virtual bool isTouched() const;
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
virtual void getDeps(std::set<ObjectIdentifier> &props) const;
|
||||
|
||||
virtual void visit(ExpressionVisitor & v);
|
||||
|
||||
protected:
|
||||
Function f; /**< Function to execute */
|
||||
std::vector<Expression *> args; /** Arguments to function*/
|
||||
};
|
||||
|
||||
/**
|
||||
* Class implementing a reference to a property. If the name is unqualified,
|
||||
* the owner of the expression is searched. If it is qualified, the document
|
||||
* that contains the owning document object is searched for other document
|
||||
* objects to search. Both labels and internal document names are searched.
|
||||
*
|
||||
*/
|
||||
|
||||
class AppExport VariableExpression : public UnitExpression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
VariableExpression(const App::DocumentObject *_owner = 0, ObjectIdentifier _var = ObjectIdentifier());
|
||||
|
||||
~VariableExpression();
|
||||
|
||||
virtual bool isTouched() const;
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const { return var.toString(); }
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
virtual void getDeps(std::set<ObjectIdentifier> &props) const;
|
||||
|
||||
std::string name() const { return var.getPropertyName(); }
|
||||
|
||||
ObjectIdentifier getPath() const { return var; }
|
||||
|
||||
void setPath(const ObjectIdentifier & path);
|
||||
|
||||
void setName(const std::string & name) { assert(0); }
|
||||
|
||||
void renameDocumentObject(const std::string & oldName, const std::string & newName);
|
||||
|
||||
void renameDocument(const std::string &oldName, const std::string &newName);
|
||||
|
||||
const App::Property *getProperty() const;
|
||||
|
||||
protected:
|
||||
|
||||
ObjectIdentifier var; /**< Variable name */
|
||||
};
|
||||
|
||||
/**
|
||||
* Class implementing a string. Used to signal either a genuine string or
|
||||
* a failed evaluation of an expression.
|
||||
*/
|
||||
|
||||
class AppExport StringExpression : public Expression {
|
||||
TYPESYSTEM_HEADER();
|
||||
public:
|
||||
StringExpression(const App::DocumentObject *_owner = 0, const std::string & _text = std::string());
|
||||
|
||||
virtual Expression * eval() const;
|
||||
|
||||
virtual Expression * simplify() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
virtual std::string getText() const { return text; }
|
||||
|
||||
virtual int priority() const { return 20; }
|
||||
|
||||
virtual Expression * copy() const;
|
||||
|
||||
protected:
|
||||
|
||||
std::string text; /**< Text string */
|
||||
};
|
||||
|
||||
namespace ExpressionParser {
|
||||
AppExport Expression * parse(const App::DocumentObject *owner, const char *buffer);
|
||||
AppExport UnitExpression * parseUnit(const App::DocumentObject *owner, const char *buffer);
|
||||
AppExport ObjectIdentifier parsePath(const App::DocumentObject *owner, const char* buffer);
|
||||
AppExport bool isTokenAnIndentifier(const std::string & str);
|
||||
AppExport std::vector<boost::tuple<int, int, std::string> > tokenize(const std::string & str);
|
||||
|
||||
/**
|
||||
* @brief The semantic_type class encapsulates the value in the parse tree during parsing.
|
||||
*/
|
||||
|
||||
class semantic_type {
|
||||
public:
|
||||
struct {
|
||||
Base::Quantity scaler;
|
||||
std::string unitStr;
|
||||
} quantity;
|
||||
Expression * expr;
|
||||
ObjectIdentifier path;
|
||||
std::deque<ObjectIdentifier::Component> components;
|
||||
int ivalue;
|
||||
double fvalue;
|
||||
struct {
|
||||
std::string name;
|
||||
double fvalue;
|
||||
} constant;
|
||||
std::vector<Expression*> arguments;
|
||||
std::string string;
|
||||
FunctionExpression::Function func;
|
||||
ObjectIdentifier::String string_or_identifier;
|
||||
semantic_type() {}
|
||||
};
|
||||
|
||||
#define YYSTYPE semantic_type
|
||||
#include "ExpressionParser.tab.h"
|
||||
#undef YYTOKENTYPE
|
||||
#undef YYSTYPE
|
||||
#undef YYSTYPE_ISDECLARED
|
||||
}
|
||||
|
||||
}
|
||||
#endif // EXPRESSION_H
|
274
src/App/ExpressionParser.l
Normal file
274
src/App/ExpressionParser.l
Normal file
|
@ -0,0 +1,274 @@
|
|||
%{
|
||||
/* Lexer for the FreeCAD Expression language */
|
||||
/* (c) 2010 Juergen Riegel LGPL */
|
||||
/* (c) 2015 Eivind Kvedalen LGPL */
|
||||
|
||||
|
||||
/* This disables inclusion of unistd.h, which is not available under Visual C++
|
||||
* on Win32. The C++ scanner uses STL streams instead. */
|
||||
#define YY_NO_UNISTD_H
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strdup _strdup
|
||||
#endif
|
||||
|
||||
extern std::stack<FunctionExpression::Function> functions; /**< Function identifier */
|
||||
extern int last_column;
|
||||
extern int column;
|
||||
|
||||
#define COUNT do { last_column = column; column += yyleng; } while (0)
|
||||
|
||||
%}
|
||||
|
||||
/*** Flex Declarations and Options ***/
|
||||
|
||||
/* change the name of the scanner class. */
|
||||
%option prefix="ExpressionParser"
|
||||
|
||||
/* the manual says "somewhat more optimized" */
|
||||
%option batch
|
||||
|
||||
%option never-interactive
|
||||
|
||||
/* no support for include files is planned */
|
||||
%option noyywrap nounput
|
||||
|
||||
/* UTF-8 unicode regular expressions. */
|
||||
|
||||
Cc ([\x00-\x1f\x7f]|\xc2[\x80-\x9f])
|
||||
Cf (\xc2\xad|\xd8[\x80-\x85\x9c]|\xdb\x9d|\xdc\x8f|\xe1(\xa0\x8e)|\xe2(\x80[\x8b-\x8f\xaa-\xae]|\x81[\xa0-\xa4\xa6-\xaf])|\xef(\xbb\xbf|\xbf[\xb9-\xbb])|\xf0(\x91(\x82\xbd))|\xf3(\xa0(\x80\x81)))
|
||||
Cn11 (\xcd[\xb8-\xb9]|\xce[\x80-\x83\x8b\x8d\xa2]|\xd4\xb0|\xd5[\x97-\x98\xa0]|\xd6[\x88\x8b-\x8c\x90]|\xd7[\x88-\x8f\xab-\xaf\xb5-\xbf]|\xd8\x9d|\xdc\x8e|\xdd[\x8b-\x8c]|\xde[\xb2-\xbf]|\xdf[\xbb-\xbf]|\xe0(\xa0[\xae-\xaf\xbf]|\xa1[\x9c-\x9d\x9f-\xbf]|\xa2[\x80-\x9f\xb3-\xbf]|\xa3[\x80-\xa3]|\xa6[\x84\x8d-\x8e\x91-\x92\xa9\xb1\xb3-\xb5\xba-\xbb]|\xa7[\x85-\x86\x89-\x8a\x8f-\x96\x98-\x9b\x9e\xa4-\xa5\xbc-\xbf]|\xa8[\x80\x84\x8b-\x8e\x91-\x92\xa9\xb1\xb4\xb7\xba-\xbb\xbd]|\xa9[\x83-\x86\x89-\x8a\x8e-\x90\x92-\x98\x9d\x9f-\xa5\xb6-\xbf]|\xaa[\x80\x84\x8e\x92\xa9\xb1\xb4\xba-\xbb]|\xab[\x86\x8a\x8e-\x8f\x91-\x9f\xa4-\xa5\xb2-\xbf]|\xac[\x80\x84\x8d-\x8e\x91-\x92\xa9\xb1\xb4\xba-\xbb]|\xad[\x85-\x86\x89-\x8a\x8e-\x95\x98-\x9b\x9e\xa4-\xa5\xb8-\xbf]|\xae[\x80-\x81\x84\x8b-\x8d\x91\x96-\x98\x9b\x9d\xa0-\xa2\xa5-\xa7\xab-\xad\xba-\xbd]|\xaf[\x83-\x85\x89\x8e-\x8f\x91-\x96\x98-\xa5\xbb-\xbf]|\xb0[\x84\x8d\x91\xa9\xba-\xbc]|\xb1[\x85\x89\x8e-\x94\x97\x9a-\x9f\xa4-\xa5\xb0-\xb7]|\xb2[\x80\x84\x8d\x91\xa9\xb4\xba-\xbb]|\xb3[\x85\x89\x8e-\x94\x97-\x9d\x9f\xa4-\xa5\xb0\xb3-\xbf]|\xb4[\x80\x84\x8d\x91\xbb-\xbc]|\xb5[\x85\x89\x8f-\x96\x98-\x9f\xa4-\xa5\xb6-\xb8]|\xb6[\x80-\x81\x84\x97-\x99\xb2\xbc\xbe-\xbf]|\xb7[\x87-\x89\x8b-\x8d]))
|
||||
Cn12 (\xe0(\xb7[\x8e\x95\x97\xa0-\xa5\xb0-\xb1\xb5-\xbf]|\xb8[\x80\xbb-\xbe]|\xb9[\x9c-\xbf]|\xba[\x80\x83\x85-\x86\x89\x8b-\x8c\x8e-\x93\x98\xa0\xa4\xa6\xa8-\xa9\xac\xba\xbe-\xbf]|\xbb[\x85\x87\x8e-\x8f\x9a-\x9b\xa0-\xbf]|\xbd[\x88\xad-\xb0]|\xbe[\x98\xbd]|\xbf[\x8d\x9b-\xbf])|\xe1(\x83[\x86\x88-\x8c\x8e-\x8f]|\x89[\x89\x8e-\x8f\x97\x99\x9e-\x9f]|\x8a[\x89\x8e-\x8f\xb1\xb6-\xb7\xbf]|\x8b[\x81\x86-\x87\x97]|\x8c[\x91\x96-\x97]|\x8d[\x9b-\x9c\xbd-\xbf]|\x8e[\x9a-\x9f]|\x8f[\xb5-\xbf]|\x9a[\x9d-\x9f]|\x9b[\xb9-\xbf]|\x9c[\x8d\x95-\x9f\xb7-\xbf]|\x9d[\x94-\x9f\xad\xb1\xb4-\xbf]|\x9f[\x9e-\x9f\xaa-\xaf\xba-\xbf]|\xa0[\x8f\x9a-\x9f]|\xa1[\xb8-\xbf]|\xa2[\xab-\xaf]|\xa3[\xb6-\xbf]|\xa4[\x9f\xac-\xaf\xbc-\xbf]|\xa5[\x81-\x83\xae-\xaf\xb5-\xbf]|\xa6[\xac-\xaf]|\xa7[\x8a-\x8f\x9b-\x9d]|\xa8[\x9c-\x9d]|\xa9[\x9f\xbd-\xbe]|\xaa[\x8a-\x8f\x9a-\x9f\xae-\xaf\xbf]|\xab[\x80-\xbf]|\xad[\x8c-\x8f\xbd-\xbf]|\xaf[\xb4-\xbb]|\xb0[\xb8-\xba]|\xb1[\x8a-\x8c]|\xb2[\x80-\xbc]))
|
||||
Cn1 ({Cn11}|{Cn12})
|
||||
Cn21 (\xe1(\xb2[\xbd-\xbf]|\xb3[\x88-\x8f\xb7\xba-\xbf]|\xb7[\xb6-\xbb]|\xbc[\x96-\x97\x9e-\x9f]|\xbd[\x86-\x87\x8e-\x8f\x98\x9a\x9c\x9e\xbe-\xbf]|\xbe\xb5|\xbf[\x85\x94-\x95\x9c\xb0-\xb1\xb5\xbf])|\xe2(\x81[\xa5\xb2-\xb3]|\x82[\x8f\x9d-\x9f\xbe-\xbf]|\x83[\x80-\x8f\xb1-\xbf]|\x86[\x8a-\x8f]|\x8f[\xbb-\xbf]|\x90[\xa7-\xbf]|\x91[\x8b-\x9f]|\xad[\xb4-\xb5]|\xae[\x96-\x97\xba-\xbc]|\xaf[\x89\x92-\xbf]|\xb0\xaf|\xb1\x9f|\xb3[\xb4-\xb8]|\xb4[\xa6\xa8-\xac\xae-\xaf]|\xb5[\xa8-\xae\xb1-\xbe]|\xb6[\x97-\x9f\xa7\xaf\xb7\xbf]|\xb7[\x87\x8f\x97\x9f]|\xb9[\x83-\xbf]|\xba\x9a|\xbb[\xb4-\xbf]|\xbf[\x96-\xaf\xbc-\xbf])|\xe3(\x81\x80|\x82[\x97-\x98]|\x84[\x80-\x84\xae-\xb0]|\x86[\x8f\xbb-\xbf]|\x87[\xa4-\xaf]|\x88\x9f|\x8b\xbf)|\xe4(\xb6[\xb6-\xbf])|\xe9(\xbf[\x8d-\xbf])|\xea(\x92[\x8d-\x8f]|\x93[\x87-\x8f]|\x98[\xac-\xbf]|\x9a\x9e|\x9b[\xb8-\xbf]|\x9e[\x8f\xae-\xaf\xb2-\xbf]|\x9f[\x80-\x92]))
|
||||
Cn22 (\xea(\x9f[\x93-\xb6]|\xa0[\xac-\xaf\xba-\xbf]|\xa1[\xb8-\xbf]|\xa3[\x85-\x8d\x9a-\x9f\xbc-\xbf]|\xa5[\x94-\x9e\xbd-\xbf]|\xa7[\x8e\x9a-\x9d\xbf]|\xa8[\xb7-\xbf]|\xa9[\x8e-\x8f\x9a-\x9b]|\xab[\x83-\x9a\xb7-\xbf]|\xac[\x80\x87-\x88\x8f-\x90\x97-\x9f\xa7\xaf]|\xad[\xa0-\xa3\xa6-\xbf]|\xae[\x80-\xbf]|\xaf[\xae-\xaf\xba-\xbf])|\xed(\x9e[\xa4-\xaf]|\x9f[\x87-\x8a\xbc-\xbf])|\xef(\xa9[\xae-\xaf]|\xab[\x9a-\xbf]|\xac[\x87-\x92\x98-\x9c\xb7\xbd\xbf]|\xad[\x82\x85]|\xaf[\x82-\x92]|\xb5[\x80-\x8f]|\xb6[\x90-\x91]|\xb7[\x88-\xaf\xbe-\xbf]|\xb8[\x9a-\x9f\xae-\xaf]|\xb9[\x93\xa7\xac-\xaf\xb5]|\xbb[\xbd-\xbe]|\xbc\x80|\xbe\xbf|\xbf[\x80-\x81\x88-\x89\x90-\x91\x98-\x99\x9d-\x9f\xa7\xaf-\xb8\xbe-\xbf])|\xf0(\x90(\x80[\x8c\xa7\xbb\xbe]|\x8e\x9e|\xa0[\x89\xb6]|\xa1\x96|\xa8[\x84\x94\x98])|\x91(\x84\xb5|\x88\x92|\x8c[\x84\xa9\xb1\xb4])|\x92(\x91\xaf)|\x96(\xa9\x9f|\xad[\x9a\xa2])|\x9d(\x91\x95|\x92[\x9d\xad\xba\xbc]|\x93\x84|\x94[\x86\x95\x9d\xba\xbf]|\x95[\x85\x91])|\x9e(\xb8[\x84\xa0\xa3\xa8\xb3\xb8\xba]|\xb9[\x88\x8a\x8c\x90\x93\x98\x9a\x9c\x9e\xa0\xa3\xab\xb3\xb8\xbd\xbf]|\xba[\x8a\xa4\xaa])|\x9f(\x83[\x80\x90]|\x84\xaf|\x93\xbf|\x95\xba|\x96\xa4)))
|
||||
Cn2 ({Cn21}|{Cn22})
|
||||
Cn ({Cn1}|{Cn2})
|
||||
Co (\xee(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xef(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]))
|
||||
Ll1 ([a-z]|\xc2\xb5|\xc3[\x9f-\xb6\xb8-\xbf]|\xc4[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7-\xb8\xba\xbc\xbe]|\xc5[\x80\x82\x84\x86\x88-\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xba\xbc\xbe-\xbf]|\xc6[\x80\x83\x85\x88\x8c-\x8d\x92\x95\x99-\x9b\x9e\xa1\xa3\xa5\xa8\xaa-\xab\xad\xb0\xb4\xb6\xb9-\xba\xbd-\xbf]|\xc7[\x86\x89\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c-\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf-\xb0\xb3\xb5\xb9\xbb\xbd\xbf]|\xc8[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3-\xb9\xbc\xbf]|\xc9[\x80\x82\x87\x89\x8b\x8d\x8f-\xbf]|\xca[\x80-\x93\x95-\xaf]|\xcd[\xb1\xb3\xb7\xbb-\xbd]|\xce[\x90\xac-\xbf]|\xcf[\x80-\x8e\x90-\x91\x95-\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf-\xb3\xb5\xb8\xbb-\xbc]|\xd0[\xb0-\xbf]|\xd1[\x80-\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xd2[\x81\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xd3[\x82\x84\x86\x88\x8a\x8c\x8e-\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xd4[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf]|\xd5[\xa1-\xbf]|\xd6[\x80-\x87]|\xe1(\xb4[\x80-\xab]|\xb5[\xab-\xb7\xb9-\xbf]|\xb6[\x80-\x85]))
|
||||
Ll2 (\xe1(\xb6[\x86-\x9a]|\xb8[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xb9[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xba[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95-\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xbb[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xbc[\x80-\x87\x90-\x95\xa0-\xa7\xb0-\xb7]|\xbd[\x80-\x85\x90-\x97\xa0-\xa7\xb0-\xbd]|\xbe[\x80-\x87\x90-\x97\xa0-\xa7\xb0-\xb4\xb6-\xb7\xbe]|\xbf[\x82-\x84\x86-\x87\x90-\x93\x96-\x97\xa0-\xa7\xb2-\xb4\xb6-\xb7])|\xe2(\x84[\x8a\x8e-\x8f\x93\xaf\xb4\xb9\xbc-\xbd]|\x85[\x86-\x89\x8e]|\x86\x84|\xb0[\xb0-\xbf]|\xb1[\x80-\x9e\xa1\xa5-\xa6\xa8\xaa\xac\xb1\xb3-\xb4\xb6-\xbb]|\xb2[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\xb3[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3-\xa4\xac\xae\xb3]|\xb4[\x80-\xa5\xa7\xad])|\xea(\x99[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad]|\x9a[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b]|\x9c[\xa3\xa5\xa7\xa9\xab\xad\xaf-\xb1\xb3\xb5\xb7\xb9\xbb\xbd\xbf]|\x9d[\x81\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9\xab\xad\xaf\xb1-\xb8\xba\xbc\xbf]|\x9e[\x81\x83\x85\x87\x8c\x8e\x91\x93-\x95\x97\x99\x9b\x9d\x9f\xa1\xa3\xa5\xa7\xa9]|\x9f\xba|\xac[\xb0-\xbf]|\xad[\x80-\x9a\xa4-\xa5])|\xef(\xac[\x80-\x86\x93-\x97]|\xbd[\x81-\x9a])|\xf0(\x9d(\x92\xbb|\x9f\x8b)))
|
||||
Ll ({Ll1}|{Ll2})
|
||||
Lm (\xca[\xb0-\xbf]|\xcb[\x80-\x81\x86-\x91\xa0-\xa4\xac\xae]|\xcd[\xb4\xba]|\xd5\x99|\xd9\x80|\xdb[\xa5-\xa6]|\xdf[\xb4-\xb5\xba]|\xe0(\xa0[\x9a\xa4\xa8]|\xa5\xb1|\xb9\x86|\xbb\x86)|\xe1(\x83\xbc|\x9f\x97|\xa1\x83|\xaa\xa7|\xb1[\xb8-\xbd]|\xb4[\xac-\xbf]|\xb5[\x80-\xaa\xb8]|\xb6[\x9b-\xbf])|\xe2(\x81[\xb1\xbf]|\x82[\x90-\x9c]|\xb1[\xbc-\xbd]|\xb5\xaf|\xb8\xaf)|\xe3(\x80[\x85\xb1-\xb5\xbb]|\x82[\x9d-\x9e]|\x83[\xbc-\xbe])|\xea(\x80\x95|\x93[\xb8-\xbd]|\x98\x8c|\x99\xbf|\x9a[\x9c-\x9d]|\x9c[\x97-\x9f]|\x9d\xb0|\x9e\x88|\x9f[\xb8-\xb9]|\xa7[\x8f\xa6]|\xa9\xb0|\xab[\x9d\xb3-\xb4]|\xad[\x9c-\x9f])|\xef(\xbd\xb0|\xbe[\x9e-\x9f]))
|
||||
Lo11111 (\xc2[\xaa\xba]|\xc6\xbb|\xc7[\x80-\x83]|\xca\x94|\xd7[\x90-\xaa\xb0-\xb2]|\xd8[\xa0-\xbf]|\xd9[\x81-\x8a\xae-\xaf\xb1-\xbf]|\xda[\x80-\xbf]|\xdb[\x80-\x93\x95\xae-\xaf\xba-\xbc\xbf]|\xdc[\x90\x92-\xaf]|\xdd[\x8d-\xbf]|\xde[\x80-\xa5\xb1]|\xdf[\x8a-\xaa]|\xe0(\xa0[\x80-\x95]|\xa1[\x80-\x98]|\xa2[\xa0-\xb2]|\xa4[\x84-\xb9\xbd]|\xa5[\x90\x98-\xa1\xb2-\xbf]|\xa6[\x80\x85-\x8c\x8f-\x90\x93-\xa8\xaa-\xb0\xb2\xb6-\xb9\xbd]|\xa7[\x8e\x9c-\x9d\x9f-\xa1\xb0-\xb1]|\xa8[\x85-\x8a\x8f-\x90\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb6\xb8-\xb9]|\xa9[\x99-\x9c\x9e\xb2-\xb4]|\xaa[\x85-\x8d\x8f-\x91\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb9\xbd]|\xab[\x90\xa0-\xa1]|\xac[\x85-\x8c\x8f-\x90\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb9\xbd]|\xad[\x9c-\x9d\x9f-\xa1\xb1]|\xae[\x83\x85-\x8a\x8e-\x90\x92-\x95\x99-\x9a\x9c\x9e-\x9f\xa3-\xa4\xa8-\xaa\xae-\xb9]|\xaf\x90|\xb0[\x85-\x8c\x8e-\x90\x92-\xa8\xaa-\xb9\xbd]|\xb1[\x98-\x99\xa0-\xa1]|\xb2[\x85-\x8c\x8e-\x90\x92-\xa8\xaa-\xb3\xb5-\xb9\xbd]|\xb3[\x9e\xa0-\xa1\xb1-\xb2]|\xb4[\x85-\x8c\x8e-\x90\x92-\xba\xbd]|\xb5[\x8e\xa0-\xa1\xba-\xbf]|\xb6[\x85-\x96\x9a-\xb1\xb3-\xbb\xbd]|\xb7[\x80-\x86]|\xb8[\x81-\xb0\xb2-\xb3]|\xb9[\x80-\x85]|\xba[\x81-\x82\x84\x87-\x88\x8a\x8d\x94-\x97\x99-\x9f\xa1-\xa3\xa5\xa7\xaa-\xab\xad-\xb0\xb2-\xb3\xbd]|\xbb[\x80-\x84\x9c-\x9f]|\xbc\x80|\xbd[\x80-\x87\x89-\xac]|\xbe[\x88-\x8c])|\xe1(\x80[\x80-\xaa\xbf]|\x81[\x90-\x95\x9a-\x9d\xa1\xa5-\xa6\xae-\xb0\xb5-\xbf]|\x82[\x80-\x81\x8e]|\x83[\x90-\xba\xbd-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\x8e]))
|
||||
Lo11112 (\xe1(\x87[\x8f-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\x88\x8a-\x8d\x90-\x96\x98\x9a-\x9d\xa0-\xbf]|\x8a[\x80-\x88\x8a-\x8d\x90-\xb0\xb2-\xb5\xb8-\xbe]|\x8b[\x80\x82-\x85\x88-\x96\x98-\xbf]|\x8c[\x80-\x90\x92-\x95\x98-\xbf]|\x8d[\x80-\x9a]|\x8e[\x80-\x8f\xa0-\xbf]|\x8f[\x80-\xb4]|\x90[\x81-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xac\xaf-\xbf]|\x9a[\x81-\x9a\xa0-\xbf]|\x9b[\x80-\xaa\xb1-\xb8]|\x9c[\x80-\x8c\x8e-\x91\xa0-\xb1]|\x9d[\x80-\x91\xa0-\xac\xae-\xb0]|\x9e[\x80-\xb3]|\x9f\x9c|\xa0[\xa0-\xbf]|\xa1[\x80-\x82\x84-\xb7]|\xa2[\x80-\x89]))
|
||||
Lo1111 ({Lo11111}|{Lo11112})
|
||||
Lo1112 (\xe1(\xa2[\x8a-\xa8\xaa\xb0-\xbf]|\xa3[\x80-\xb5]|\xa4[\x80-\x9e]|\xa5[\x90-\xad\xb0-\xb4]|\xa6[\x80-\xab]|\xa7[\x81-\x87]|\xa8[\x80-\x96\xa0-\xbf]|\xa9[\x80-\x94]|\xac[\x85-\xb3]|\xad[\x85-\x8b]|\xae[\x83-\xa0\xae-\xaf\xba-\xbf]|\xaf[\x80-\xa5]|\xb0[\x80-\xa3]|\xb1[\x8d-\x8f\x9a-\xb7]|\xb3[\xa9-\xac\xae-\xb1\xb5-\xb6])|\xe2(\x84[\xb5-\xb8]|\xb4[\xb0-\xbf]|\xb5[\x80-\xa7]|\xb6[\x80-\x96\xa0-\xa6\xa8-\xae\xb0-\xb6\xb8-\xbe]|\xb7[\x80-\x86\x88-\x8e\x90-\x96\x98-\x9e])|\xe3(\x80[\x86\xbc]|\x81[\x81-\xbf]|\x82[\x80-\x96\x9f\xa1-\xbf]|\x83[\x80-\xba\xbf]|\x84[\x85-\xad\xb1-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\x8e\xa0-\xba]|\x87[\xb0-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\x97]))
|
||||
Lo111 ({Lo1111}|{Lo1112})
|
||||
Lo112 (\xe3(\xad[\x98-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe4(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xb5]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe5(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xa3]))
|
||||
Lo11 ({Lo111}|{Lo112})
|
||||
Lo121 (\xe5(\x88[\xa4-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe6(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xa5]))
|
||||
Lo122 (\xe6(\xa2[\xa6-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe7(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xa8]))
|
||||
Lo12 ({Lo121}|{Lo122})
|
||||
Lo1 ({Lo11}|{Lo12})
|
||||
Lo211 (\xe7(\xbc[\xa9-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe8(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe9(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xaa]))
|
||||
Lo212 (\xe9(\x96[\xab-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\x8c])|\xea(\x80[\x80-\x94\x96-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\x8c]|\x93[\x90-\xb7]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\x8b\x90-\x9f\xaa-\xab]|\x99\xae|\x9a[\xa0-\xbf]|\x9b[\x80-\xa5]|\x9f[\xb7\xbb-\xbf]|\xa0[\x80-\x81\x83-\x85\x87-\x8a\x8c-\xa2]|\xa1[\x80-\xb3]|\xa2[\x82-\xb3]|\xa3[\xb2-\xb7\xbb]|\xa4[\x8a-\xa5\xb0-\xbf]|\xa5[\x80-\x86\xa0-\xbc]|\xa6[\x84-\xb2]|\xa7[\xa0-\xa4\xa7-\xaf\xba-\xbe]|\xa8[\x80-\xa8]|\xa9[\x80-\x82\x84-\x8b\xa0-\xaf\xb1-\xb6\xba\xbe-\xbf]|\xaa[\x80-\xaf\xb1\xb5-\xb6\xb9-\xbd]|\xab[\x80\x82\x9b-\x9c\xa0-\xaa\xb2]|\xac[\x81-\x86\x89-\x8e\x91-\x96\xa0-\xa6\xa8-\xae]|\xaf[\x80-\xa2]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xeb(\x80[\x80-\xbf]|\x81[\x80-\x8a]))
|
||||
Lo21 ({Lo211}|{Lo212})
|
||||
Lo221 (\xeb(\x81[\x8b-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xec(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\x8c]))
|
||||
Lo222 (\xec(\x9b[\x8d-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xed(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xa3\xb0-\xbf]|\x9f[\x80-\x86\x8b-\xbb])|\xef(\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xad\xb0-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\x99]|\xac[\x9d\x9f-\xa8\xaa-\xb6\xb8-\xbc\xbe]|\xad[\x80-\x81\x83-\x84\x86-\xbf]|\xae[\x80-\xb1]|\xaf[\x93-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbd]|\xb5[\x90-\xbf]|\xb6[\x80-\x8f\x92-\xbf]|\xb7[\x80-\x87\xb0-\xbb]|\xb9[\xb0-\xb4\xb6-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbc]|\xbd[\xa6-\xaf\xb1-\xbf]|\xbe[\x80-\x9d\xa0-\xbe]|\xbf[\x82-\x87\x8a-\x8f\x92-\x97\x9a-\x9c])|\xf0(\x90(\xa0[\x88\xbc]|\xa8\x80)|\x91(\x85\xb6|\x87\x9a|\x8c\xbd|\x93\x87|\x99\x84|\xa3\xbf)|\x96(\xbd\x90)|\x9e(\xb8[\xa4\xa7\xb9\xbb]|\xb9[\x82\x87\x89\x8b\x94\x97\x99\x9b\x9d\x9f\xa4\xbe])))
|
||||
Lo22 ({Lo221}|{Lo222})
|
||||
Lo2 ({Lo21}|{Lo22})
|
||||
Lo ({Lo1}|{Lo2})
|
||||
Lt (\xc7[\x85\x88\x8b\xb2]|\xe1(\xbe[\x88-\x8f\x98-\x9f\xa8-\xaf\xbc]|\xbf[\x8c\xbc]))
|
||||
Lu1 ([A-Z]|\xc3[\x80-\x96\x98-\x9e]|\xc4[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb9\xbb\xbd\xbf]|\xc5[\x81\x83\x85\x87\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8-\xb9\xbb\xbd]|\xc6[\x81-\x82\x84\x86-\x87\x89-\x8b\x8e-\x91\x93-\x94\x96-\x98\x9c-\x9d\x9f-\xa0\xa2\xa4\xa6-\xa7\xa9\xac\xae-\xaf\xb1-\xb3\xb5\xb7-\xb8\xbc]|\xc7[\x84\x87\x8a\x8d\x8f\x91\x93\x95\x97\x99\x9b\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb1\xb4\xb6-\xb8\xba\xbc\xbe]|\xc8[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xba-\xbb\xbd-\xbe]|\xc9[\x81\x83-\x86\x88\x8a\x8c\x8e]|\xcd[\xb0\xb2\xb6\xbf]|\xce[\x86\x88-\x8a\x8c\x8e-\x8f\x91-\xa1\xa3-\xab]|\xcf[\x8f\x92-\x94\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb4\xb7\xb9-\xba\xbd-\xbf]|\xd0[\x80-\xaf]|\xd1[\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xd2[\x80\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xd3[\x80-\x81\x83\x85\x87\x89\x8b\x8d\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xd4[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb1-\xbf]|\xd5[\x80-\x96]|\xe1(\x82[\xa0-\xb4]))
|
||||
Lu2 (\xe1(\x82[\xb5-\xbf]|\x83[\x80-\x85\x87\x8d]|\xb8[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xb9[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xba[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xbb[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xbc[\x88-\x8f\x98-\x9d\xa8-\xaf\xb8-\xbf]|\xbd[\x88-\x8d\x99\x9b\x9d\x9f\xa8-\xaf]|\xbe[\xb8-\xbb]|\xbf[\x88-\x8b\x98-\x9b\xa8-\xac\xb8-\xbb])|\xe2(\x84[\x82\x87\x8b-\x8d\x90-\x92\x95\x99-\x9d\xa4\xa6\xa8\xaa-\xad\xb0-\xb3\xbe-\xbf]|\x85\x85|\x86\x83|\xb0[\x80-\xae]|\xb1[\xa0\xa2-\xa4\xa7\xa9\xab\xad-\xb0\xb2\xb5\xbe-\xbf]|\xb2[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb0\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\xb3[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xab\xad\xb2])|\xea(\x99[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac]|\x9a[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a]|\x9c[\xa2\xa4\xa6\xa8\xaa\xac\xae\xb2\xb4\xb6\xb8\xba\xbc\xbe]|\x9d[\x80\x82\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa\xac\xae\xb9\xbb\xbd-\xbe]|\x9e[\x80\x82\x84\x86\x8b\x8d\x90\x92\x96\x98\x9a\x9c\x9e\xa0\xa2\xa4\xa6\xa8\xaa-\xad\xb0-\xb1])|\xef(\xbc[\xa1-\xba])|\xf0(\x9d(\x92[\x9c\xa2]|\x95\x86|\x9f\x8a)))
|
||||
Lu ({Lu1}|{Lu2})
|
||||
Mc (\xe0(\xa4[\x83\xbb\xbe-\xbf]|\xa5[\x80\x89-\x8c\x8e-\x8f]|\xa6[\x82-\x83\xbe-\xbf]|\xa7[\x80\x87-\x88\x8b-\x8c\x97]|\xa8[\x83\xbe-\xbf]|\xa9\x80|\xaa[\x83\xbe-\xbf]|\xab[\x80\x89\x8b-\x8c]|\xac[\x82-\x83\xbe]|\xad[\x80\x87-\x88\x8b-\x8c\x97]|\xae[\xbe-\xbf]|\xaf[\x81-\x82\x86-\x88\x8a-\x8c\x97]|\xb0[\x81-\x83]|\xb1[\x81-\x84]|\xb2[\x82-\x83\xbe]|\xb3[\x80-\x84\x87-\x88\x8a-\x8b\x95-\x96]|\xb4[\x82-\x83\xbe-\xbf]|\xb5[\x80\x86-\x88\x8a-\x8c\x97]|\xb6[\x82-\x83]|\xb7[\x8f-\x91\x98-\x9f\xb2-\xb3]|\xbc[\xbe-\xbf]|\xbd\xbf)|\xe1(\x80[\xab-\xac\xb1\xb8\xbb-\xbc]|\x81[\x96-\x97\xa2-\xa4\xa7-\xad]|\x82[\x83-\x84\x87-\x8c\x8f\x9a-\x9c]|\x9e[\xb6\xbe-\xbf]|\x9f[\x80-\x85\x87-\x88]|\xa4[\xa3-\xa6\xa9-\xab\xb0-\xb1\xb3-\xb8]|\xa6[\xb0-\xbf]|\xa7[\x80\x88-\x89]|\xa8[\x99-\x9a]|\xa9[\x95\x97\xa1\xa3-\xa4\xad-\xb2]|\xac[\x84\xb5\xbb\xbd-\xbf]|\xad[\x80-\x81\x83-\x84]|\xae[\x82\xa1\xa6-\xa7\xaa]|\xaf[\xa7\xaa-\xac\xae\xb2-\xb3]|\xb0[\xa4-\xab\xb4-\xb5]|\xb3[\xa1\xb2-\xb3])|\xe3(\x80[\xae-\xaf])|\xea(\xa0[\xa3-\xa4\xa7]|\xa2[\x80-\x81\xb4-\xbf]|\xa3[\x80-\x83]|\xa5[\x92-\x93]|\xa6[\x83\xb4-\xb5\xba-\xbb\xbd-\xbf]|\xa7\x80|\xa8[\xaf-\xb0\xb3-\xb4]|\xa9[\x8d\xbb\xbd]|\xab[\xab\xae-\xaf\xb5]|\xaf[\xa3-\xa4\xa6-\xa7\xa9-\xaa\xac])|\xf0(\x91(\x80[\x80\x82]|\x82\x82|\x84\xac|\x86\x82|\x88\xb5|\x8d\x97|\x92\xb9|\x93\x81|\x96\xbe|\x98\xbe|\x9a[\xac\xb6])))
|
||||
Me (\xd2[\x88-\x89]|\xe1(\xaa\xbe)|\xe2(\x83[\x9d-\xa0\xa2-\xa4])|\xea(\x99[\xb0-\xb2]))
|
||||
Mn1 (\xcc[\x80-\xbf]|\xcd[\x80-\xaf]|\xd2[\x83-\x87]|\xd6[\x91-\xbd\xbf]|\xd7[\x81-\x82\x84-\x85\x87]|\xd8[\x90-\x9a]|\xd9[\x8b-\x9f\xb0]|\xdb[\x96-\x9c\x9f-\xa4\xa7-\xa8\xaa-\xad]|\xdc[\x91\xb0-\xbf]|\xdd[\x80-\x8a]|\xde[\xa6-\xb0]|\xdf[\xab-\xb3]|\xe0(\xa0[\x96-\x99\x9b-\xa3\xa5-\xa7\xa9-\xad]|\xa1[\x99-\x9b]|\xa3[\xa4-\xbf]|\xa4[\x80-\x82\xba\xbc]|\xa5[\x81-\x88\x8d\x91-\x97\xa2-\xa3]|\xa6[\x81\xbc]|\xa7[\x81-\x84\x8d\xa2-\xa3]|\xa8[\x81-\x82\xbc]|\xa9[\x81-\x82\x87-\x88\x8b-\x8d\x91\xb0-\xb1\xb5]|\xaa[\x81-\x82\xbc]|\xab[\x81-\x85\x87-\x88\x8d\xa2-\xa3]|\xac[\x81\xbc\xbf]|\xad[\x81-\x84\x8d\x96\xa2-\xa3]|\xae\x82|\xaf[\x80\x8d]|\xb0[\x80\xbe-\xbf]|\xb1[\x80\x86-\x88\x8a-\x8d\x95-\x96\xa2-\xa3]|\xb2[\x81\xbc\xbf]|\xb3[\x86\x8c-\x8d\xa2-\xa3]|\xb4\x81|\xb5[\x81-\x84\x8d\xa2-\xa3]|\xb7[\x8a\x92-\x94\x96]|\xb8[\xb1\xb4-\xba]|\xb9[\x87-\x8e]|\xba[\xb1\xb4-\xb9\xbb-\xbc]|\xbb[\x88-\x8d]|\xbc[\x98-\x99\xb5\xb7\xb9]|\xbd[\xb1-\xbe]|\xbe[\x80-\x84\x86-\x87\x8d-\x97\x99-\x9a]))
|
||||
Mn2 (\xe0(\xbe[\x9b-\xbc]|\xbf\x86)|\xe1(\x80[\xad-\xb0\xb2-\xb7\xb9-\xba\xbd-\xbe]|\x81[\x98-\x99\x9e-\xa0\xb1-\xb4]|\x82[\x82\x85-\x86\x8d\x9d]|\x8d[\x9d-\x9f]|\x9c[\x92-\x94\xb2-\xb4]|\x9d[\x92-\x93\xb2-\xb3]|\x9e[\xb4-\xb5\xb7-\xbd]|\x9f[\x86\x89-\x93\x9d]|\xa0[\x8b-\x8d]|\xa2\xa9|\xa4[\xa0-\xa2\xa7-\xa8\xb2\xb9-\xbb]|\xa8[\x97-\x98\x9b]|\xa9[\x96\x98-\x9e\xa0\xa2\xa5-\xac\xb3-\xbc\xbf]|\xaa[\xb0-\xbd]|\xac[\x80-\x83\xb4\xb6-\xba\xbc]|\xad[\x82\xab-\xb3]|\xae[\x80-\x81\xa2-\xa5\xa8-\xa9\xab-\xad]|\xaf[\xa6\xa8-\xa9\xad\xaf-\xb1]|\xb0[\xac-\xb3\xb6-\xb7]|\xb3[\x90-\x92\x94-\xa0\xa2-\xa8\xad\xb4\xb8-\xb9]|\xb7[\x80-\xb5\xbc-\xbf])|\xe2(\x83[\x90-\x9c\xa1\xa5-\xb0]|\xb3[\xaf-\xb1]|\xb5\xbf|\xb7[\xa0-\xbf])|\xe3(\x80[\xaa-\xad]|\x82[\x99-\x9a])|\xea(\x99[\xaf\xb4-\xbd]|\x9a\x9f|\x9b[\xb0-\xb1]|\xa0[\x82\x86\x8b\xa5-\xa6]|\xa3[\x84\xa0-\xb1]|\xa4[\xa6-\xad]|\xa5[\x87-\x91]|\xa6[\x80-\x82\xb3\xb6-\xb9\xbc]|\xa7\xa5|\xa8[\xa9-\xae\xb1-\xb2\xb5-\xb6]|\xa9[\x83\x8c\xbc]|\xaa[\xb0\xb2-\xb4\xb7-\xb8\xbe-\xbf]|\xab[\x81\xac-\xad\xb6]|\xaf[\xa5\xa8\xad])|\xef(\xac\x9e|\xb8[\x80-\x8f\xa0-\xad])|\xf0(\x90(\x87\xbd|\x8b\xa0|\xa8\xbf)|\x91(\x80\x81|\x85\xb3|\x88\xb4|\x8b\x9f|\x8c[\x81\xbc]|\x8d\x80|\x92\xba|\x98\xbd|\x9a[\xab\xad\xb7])))
|
||||
Mn ({Mn1}|{Mn2})
|
||||
Nd ([0-9]|\xd9[\xa0-\xa9]|\xdb[\xb0-\xb9]|\xdf[\x80-\x89]|\xe0(\xa5[\xa6-\xaf]|\xa7[\xa6-\xaf]|\xa9[\xa6-\xaf]|\xab[\xa6-\xaf]|\xad[\xa6-\xaf]|\xaf[\xa6-\xaf]|\xb1[\xa6-\xaf]|\xb3[\xa6-\xaf]|\xb5[\xa6-\xaf]|\xb7[\xa6-\xaf]|\xb9[\x90-\x99]|\xbb[\x90-\x99]|\xbc[\xa0-\xa9])|\xe1(\x81[\x80-\x89]|\x82[\x90-\x99]|\x9f[\xa0-\xa9]|\xa0[\x90-\x99]|\xa5[\x86-\x8f]|\xa7[\x90-\x99]|\xaa[\x80-\x89\x90-\x99]|\xad[\x90-\x99]|\xae[\xb0-\xb9]|\xb1[\x80-\x89\x90-\x99])|\xea(\x98[\xa0-\xa9]|\xa3[\x90-\x99]|\xa4[\x80-\x89]|\xa7[\x90-\x99\xb0-\xb9]|\xa9[\x90-\x99]|\xaf[\xb0-\xb9])|\xef(\xbc[\x90-\x99]))
|
||||
Nl (\xe1(\x9b[\xae-\xb0])|\xe2(\x85[\xa0-\xbf]|\x86[\x80-\x82\x85-\x88])|\xe3(\x80[\x87\xa1-\xa9\xb8-\xba])|\xea(\x9b[\xa6-\xaf])|\xf0(\x90(\x8d[\x81\x8a])))
|
||||
No (\xc2[\xb2-\xb3\xb9\xbc-\xbe]|\xe0(\xa7[\xb4-\xb9]|\xad[\xb2-\xb7]|\xaf[\xb0-\xb2]|\xb1[\xb8-\xbe]|\xb5[\xb0-\xb5]|\xbc[\xaa-\xb3])|\xe1(\x8d[\xa9-\xbc]|\x9f[\xb0-\xb9]|\xa7\x9a)|\xe2(\x81[\xb0\xb4-\xb9]|\x82[\x80-\x89]|\x85[\x90-\x9f]|\x86\x89|\x91[\xa0-\xbf]|\x92[\x80-\x9b]|\x93[\xaa-\xbf]|\x9d[\xb6-\xbf]|\x9e[\x80-\x93]|\xb3\xbd)|\xe3(\x86[\x92-\x95]|\x88[\xa0-\xa9]|\x89[\x88-\x8f\x91-\x9f]|\x8a[\x80-\x89\xb1-\xbf])|\xea(\xa0[\xb0-\xb5]))
|
||||
Pc (_|\xe2(\x80\xbf|\x81[\x80\x94])|\xef(\xb8[\xb3-\xb4]|\xb9[\x8d-\x8f]|\xbc\xbf))
|
||||
Pd (-|\xd6[\x8a\xbe]|\xe1(\x90\x80|\xa0\x86)|\xe2(\x80[\x90-\x95]|\xb8[\x97\x9a\xba-\xbb]|\xb9\x80)|\xe3(\x80[\x9c\xb0]|\x82\xa0)|\xef(\xb8[\xb1-\xb2]|\xb9[\x98\xa3]|\xbc\x8d))
|
||||
Pe ([\)\]\}]|\xe0(\xbc[\xbb\xbd])|\xe1(\x9a\x9c)|\xe2(\x81[\x86\xbe]|\x82\x8e|\x8c[\x89\x8b\xaa]|\x9d[\xa9\xab\xad\xaf\xb1\xb3\xb5]|\x9f[\x86\xa7\xa9\xab\xad\xaf]|\xa6[\x84\x86\x88\x8a\x8c\x8e\x90\x92\x94\x96\x98]|\xa7[\x99\x9b\xbd]|\xb8[\xa3\xa5\xa7\xa9])|\xe3(\x80[\x89\x8b\x8d\x8f\x91\x95\x97\x99\x9b\x9e-\x9f])|\xef(\xb4\xbe|\xb8[\x98\xb6\xb8\xba\xbc\xbe]|\xb9[\x80\x82\x84\x88\x9a\x9c\x9e]|\xbc[\x89\xbd]|\xbd[\x9d\xa0\xa3]))
|
||||
Pf (\xc2\xbb|\xe2(\x80[\x99\x9d\xba]|\xb8[\x83\x85\x8a\x8d\x9d\xa1]))
|
||||
Pi (\xc2\xab|\xe2(\x80[\x98\x9b-\x9c\x9f\xb9]|\xb8[\x82\x84\x89\x8c\x9c\xa0]))
|
||||
Po ([!-\#%-\'\*,\.-\/\:-;\?-@\\]|\xc2[\xa1\xa7\xb6-\xb7\xbf]|\xcd\xbe|\xce\x87|\xd5[\x9a-\x9f]|\xd6\x89|\xd7[\x80\x83\x86\xb3-\xb4]|\xd8[\x89-\x8a\x8c-\x8d\x9b\x9e-\x9f]|\xd9[\xaa-\xad]|\xdb\x94|\xdc[\x80-\x8d]|\xdf[\xb7-\xb9]|\xe0(\xa0[\xb0-\xbe]|\xa1\x9e|\xa5[\xa4-\xa5\xb0]|\xab\xb0|\xb7\xb4|\xb9[\x8f\x9a-\x9b]|\xbc[\x84-\x92\x94]|\xbe\x85|\xbf[\x90-\x94\x99-\x9a])|\xe1(\x81[\x8a-\x8f]|\x83\xbb|\x8d[\xa0-\xa8]|\x99[\xad-\xae]|\x9b[\xab-\xad]|\x9c[\xb5-\xb6]|\x9f[\x94-\x96\x98-\x9a]|\xa0[\x80-\x85\x87-\x8a]|\xa5[\x84-\x85]|\xa8[\x9e-\x9f]|\xaa[\xa0-\xa6\xa8-\xad]|\xad[\x9a-\xa0]|\xaf[\xbc-\xbf]|\xb0[\xbb-\xbf]|\xb1[\xbe-\xbf]|\xb3[\x80-\x87\x93])|\xe2(\x80[\x96-\x97\xa0-\xa7\xb0-\xb8\xbb-\xbe]|\x81[\x81-\x83\x87-\x91\x93\x95-\x9e]|\xb3[\xb9-\xbc\xbe-\xbf]|\xb5\xb0|\xb8[\x80-\x81\x86-\x88\x8b\x8e-\x96\x98-\x99\x9b\x9e-\x9f\xaa-\xae\xb0-\xb9\xbc-\xbf]|\xb9\x81)|\xe3(\x80[\x81-\x83\xbd]|\x83\xbb)|\xea(\x93[\xbe-\xbf]|\x98[\x8d-\x8f]|\x99[\xb3\xbe]|\x9b[\xb2-\xb7]|\xa1[\xb4-\xb7]|\xa3[\x8e-\x8f\xb8-\xba]|\xa4[\xae-\xaf]|\xa5\x9f|\xa7[\x81-\x8d\x9e-\x9f]|\xa9[\x9c-\x9f]|\xab[\x9e-\x9f\xb0-\xb1]|\xaf\xab)|\xef(\xb8[\x90-\x96\x99\xb0]|\xb9[\x85-\x86\x89-\x8c\x90-\x92\x94-\x97\x9f-\xa1\xa8\xaa-\xab]|\xbc[\x81-\x83\x85-\x87\x8a\x8c\x8e-\x8f\x9a-\x9b\x9f-\xa0\xbc]|\xbd[\xa1\xa4-\xa5])|\xf0(\x90(\x8e\x9f|\x8f\x90|\x95\xaf|\xa1\x97|\xa4[\x9f\xbf]|\xa9\xbf)|\x91(\x87\x8d|\x93\x86)|\x96(\xab\xb5|\xad\x84)|\x9b(\xb2\x9f)))
|
||||
Ps ([\(\[\{]|\xe0(\xbc[\xba\xbc])|\xe1(\x9a\x9b)|\xe2(\x80[\x9a\x9e]|\x81[\x85\xbd]|\x82\x8d|\x8c[\x88\x8a\xa9]|\x9d[\xa8\xaa\xac\xae\xb0\xb2\xb4]|\x9f[\x85\xa6\xa8\xaa\xac\xae]|\xa6[\x83\x85\x87\x89\x8b\x8d\x8f\x91\x93\x95\x97]|\xa7[\x98\x9a\xbc]|\xb8[\xa2\xa4\xa6\xa8]|\xb9\x82)|\xe3(\x80[\x88\x8a\x8c\x8e\x90\x94\x96\x98\x9a\x9d])|\xef(\xb4\xbf|\xb8[\x97\xb5\xb7\xb9\xbb\xbd\xbf]|\xb9[\x81\x83\x87\x99\x9b\x9d]|\xbc[\x88\xbb]|\xbd[\x9b\x9f\xa2]))
|
||||
Sc ($|\xc2[\xa2-\xa5]|\xd6\x8f|\xd8\x8b|\xe0(\xa7[\xb2-\xb3\xbb]|\xab\xb1|\xaf\xb9|\xb8\xbf)|\xe1(\x9f\x9b)|\xe2(\x82[\xa0-\xbd])|\xea(\xa0\xb8)|\xef(\xb7\xbc|\xb9\xa9|\xbc\x84|\xbf[\xa0-\xa1\xa5-\xa6]))
|
||||
Sk ([\^`]|\xc2[\xa8\xaf\xb4\xb8]|\xcb[\x82-\x85\x92-\x9f\xa5-\xab\xad\xaf-\xbf]|\xcd\xb5|\xce[\x84-\x85]|\xe1(\xbe[\xbd\xbf]|\xbf[\x80-\x81\x8d-\x8f\x9d-\x9f\xad-\xaf\xbd-\xbe])|\xe3(\x82[\x9b-\x9c])|\xea(\x9c[\x80-\x96\xa0-\xa1]|\x9e[\x89-\x8a]|\xad\x9b)|\xef(\xae[\xb2-\xbf]|\xaf[\x80-\x81]|\xbc\xbe|\xbd\x80|\xbf\xa3))
|
||||
Sm ([\+<->\|~]|\xc2[\xac\xb1]|\xc3[\x97\xb7]|\xcf\xb6|\xd8[\x86-\x88]|\xe2(\x81[\x84\x92\xba-\xbc]|\x82[\x8a-\x8c]|\x84\x98|\x85[\x80-\x84\x8b]|\x86[\x90-\x94\x9a-\x9b\xa0\xa3\xa6\xae]|\x87[\x8e-\x8f\x92\x94\xb4-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\xa0-\xa1]|\x8d\xbc|\x8e[\x9b-\xb3]|\x8f[\x9c-\xa1]|\x96\xb7|\x97[\x81\xb8-\xbf]|\x99\xaf|\x9f[\x80-\x84\x87-\xa5\xb0-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\x82\x99-\xbf]|\xa7[\x80-\x97\x9c-\xbb\xbe-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\xb0-\xbf]|\xad[\x80-\x84\x87-\x8c])|\xef(\xac\xa9|\xb9[\xa2\xa4-\xa6]|\xbc[\x8b\x9c-\x9e]|\xbd[\x9c\x9e]|\xbf[\xa2\xa9-\xac])|\xf0(\x9d(\x9b[\x81\x9b\xbb]|\x9c[\x95\xb5]|\x9d[\x8f\xaf]|\x9e[\x89\xa9]|\x9f\x83)))
|
||||
So (\xc2[\xa6\xa9\xae\xb0]|\xd2\x82|\xd6[\x8d-\x8e]|\xd8[\x8e-\x8f]|\xdb[\x9e\xa9\xbd-\xbe]|\xdf\xb6|\xe0(\xa7\xba|\xad\xb0|\xaf[\xb3-\xb8\xba]|\xb1\xbf|\xb5\xb9|\xbc[\x81-\x83\x93\x95-\x97\x9a-\x9f\xb4\xb6\xb8]|\xbe[\xbe-\xbf]|\xbf[\x80-\x85\x87-\x8c\x8e-\x8f\x95-\x98])|\xe1(\x82[\x9e-\x9f]|\x8e[\x90-\x99]|\xa5\x80|\xa7[\x9e-\xbf]|\xad[\xa1-\xaa\xb4-\xbc])|\xe2(\x84[\x80-\x81\x83-\x86\x88-\x89\x94\x96-\x97\x9e-\xa3\xa5\xa7\xa9\xae\xba-\xbb]|\x85[\x8a\x8c-\x8d\x8f]|\x86[\x95-\x99\x9c-\x9f\xa1-\xa2\xa4-\xa5\xa7-\xad\xaf-\xbf]|\x87[\x80-\x8d\x90-\x91\x93\x95-\xb3]|\x8c[\x80-\x87\x8c-\x9f\xa2-\xa8\xab-\xbf]|\x8d[\x80-\xbb\xbd-\xbf]|\x8e[\x80-\x9a\xb4-\xbf]|\x8f[\x80-\x9b\xa2-\xba]|\x90[\x80-\xa6]|\x91[\x80-\x8a]|\x92[\x9c-\xbf]|\x93[\x80-\xa9]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xb6\xb8-\xbf]|\x97[\x80\x82-\xb7]|\x98[\x80-\xbf]|\x99[\x80-\xae\xb0-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xa7]|\x9e[\x94-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xac[\x80-\xaf]|\xad[\x85-\x86\x8d-\xb3\xb6-\xbf]|\xae[\x80-\x95\x98-\xb9\xbd-\xbf]|\xaf[\x80-\x88\x8a-\x91]|\xb3[\xa5-\xaa]|\xba[\x80-\x99\x9b-\xbf]|\xbb[\x80-\xb3]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\x95\xb0-\xbb])|\xe3(\x80[\x84\x92-\x93\xa0\xb6-\xb7\xbe-\xbf]|\x86[\x90-\x91\x96-\x9f]|\x87[\x80-\xa3]|\x88[\x80-\x9e\xaa-\xbf]|\x89[\x80-\x87\x90\xa0-\xbf]|\x8a[\x8a-\xb0]|\x8b[\x80-\xbe]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf])|\xe4(\xb7[\x80-\xbf])|\xea(\x92[\x90-\xbf]|\x93[\x80-\x86]|\xa0[\xa8-\xab\xb6-\xb7\xb9]|\xa9[\xb7-\xb9])|\xef(\xb7\xbd|\xbf[\xa4\xa8\xad-\xae\xbc-\xbd])|\xf0(\x90(\x86[\x8c\xa0]|\xab\x88)|\x96(\xad\x85)|\x9b(\xb2\x9c)|\x9d(\x89\x85)))
|
||||
Zl (\xe2(\x80\xa8))
|
||||
Zp (\xe2(\x80\xa9))
|
||||
Zs (\x20|\xc2\xa0|\xe1(\x9a\x80)|\xe2(\x80[\x80-\x8a\xaf]|\x81\x9f)|\xe3(\x80\x80))
|
||||
L11111 ([A-Za-z]|\xc2[\xaa\xb5\xba]|\xc3[\x80-\x96\x98-\xb6\xb8-\xbf]|\xc4[\x80-\xbf]|\xc5[\x80-\xbf]|\xc6[\x80-\xbf]|\xc7[\x80-\xbf]|\xc8[\x80-\xbf]|\xc9[\x80-\xbf]|\xca[\x80-\xbf]|\xcb[\x80-\x81\x86-\x91\xa0-\xa4\xac\xae]|\xcd[\xb0-\xb4\xb6-\xb7\xba-\xbd\xbf]|\xce[\x86\x88-\x8a\x8c\x8e-\xa1\xa3-\xbf]|\xcf[\x80-\xb5\xb7-\xbf]|\xd0[\x80-\xbf]|\xd1[\x80-\xbf]|\xd2[\x80-\x81\x8a-\xbf]|\xd3[\x80-\xbf]|\xd4[\x80-\xaf\xb1-\xbf]|\xd5[\x80-\x96\x99\xa1-\xbf]|\xd6[\x80-\x87]|\xd7[\x90-\xaa\xb0-\xb2]|\xd8[\xa0-\xbf]|\xd9[\x80-\x8a\xae-\xaf\xb1-\xbf]|\xda[\x80-\xbf]|\xdb[\x80-\x93\x95\xa5-\xa6\xae-\xaf\xba-\xbc\xbf]|\xdc[\x90\x92-\xaf]|\xdd[\x8d-\xbf]|\xde[\x80-\xa5\xb1]|\xdf[\x8a-\xaa\xb4-\xb5\xba]|\xe0(\xa0[\x80-\x95\x9a\xa4\xa8]|\xa1[\x80-\x98]|\xa2[\xa0-\xb2]|\xa4[\x84-\x98]))
|
||||
L11112 (\xe0(\xa4[\x99-\xb9\xbd]|\xa5[\x90\x98-\xa1\xb1-\xbf]|\xa6[\x80\x85-\x8c\x8f-\x90\x93-\xa8\xaa-\xb0\xb2\xb6-\xb9\xbd]|\xa7[\x8e\x9c-\x9d\x9f-\xa1\xb0-\xb1]|\xa8[\x85-\x8a\x8f-\x90\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb6\xb8-\xb9]|\xa9[\x99-\x9c\x9e\xb2-\xb4]|\xaa[\x85-\x8d\x8f-\x91\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb9\xbd]|\xab[\x90\xa0-\xa1]|\xac[\x85-\x8c\x8f-\x90\x93-\xa8\xaa-\xb0\xb2-\xb3\xb5-\xb9\xbd]|\xad[\x9c-\x9d\x9f-\xa1\xb1]|\xae[\x83\x85-\x8a\x8e-\x90\x92-\x95\x99-\x9a\x9c\x9e-\x9f\xa3-\xa4\xa8-\xaa\xae-\xb9]|\xaf\x90|\xb0[\x85-\x8c\x8e-\x90\x92-\xa8\xaa-\xb9\xbd]|\xb1[\x98-\x99\xa0-\xa1]|\xb2[\x85-\x8c\x8e-\x90\x92-\xa8\xaa-\xb3\xb5-\xb9\xbd]|\xb3[\x9e\xa0-\xa1\xb1-\xb2]|\xb4[\x85-\x8c\x8e-\x90\x92-\xba\xbd]|\xb5[\x8e\xa0-\xa1\xba-\xbf]|\xb6[\x85-\x96\x9a-\xb1\xb3-\xbb\xbd]|\xb7[\x80-\x86]|\xb8[\x81-\xb0\xb2-\xb3]|\xb9[\x80-\x86]|\xba[\x81-\x82\x84\x87-\x88\x8a\x8d\x94-\x97\x99-\x9f\xa1-\xa3\xa5\xa7\xaa-\xab\xad-\xb0\xb2-\xb3\xbd]|\xbb[\x80-\x84\x86\x9c-\x9f]|\xbc\x80|\xbd[\x80-\x87\x89-\xac]|\xbe[\x88-\x8c])|\xe1(\x80[\x80-\xaa\xbf]|\x81[\x90-\x95\x9a-\x9d\xa1\xa5-\xa6\xae-\xb0\xb5-\xbf]|\x82[\x80-\x81\x8e\xa0-\xbf]|\x83[\x80-\x85\x87\x8d\x90-\xba\xbc-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\x88\x8a-\x8d\x90-\x96\x98\x9a-\x9d\xa0-\xbf]|\x8a[\x80-\x88\x8a-\x8d\x90-\xb0\xb2-\xb5\xb8-\xbe]|\x8b[\x80\x82-\x85\x88-\x96\x98-\xbf]|\x8c[\x80-\x90\x92-\x95\x98-\xbf]|\x8d[\x80-\x9a]|\x8e[\x80-\x8f\xa0-\xbf]|\x8f[\x80-\xa8]))
|
||||
L1111 ({L11111}|{L11112})
|
||||
L1112 (\xe1(\x8f[\xa9-\xb4]|\x90[\x81-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xac\xaf-\xbf]|\x9a[\x81-\x9a\xa0-\xbf]|\x9b[\x80-\xaa\xb1-\xb8]|\x9c[\x80-\x8c\x8e-\x91\xa0-\xb1]|\x9d[\x80-\x91\xa0-\xac\xae-\xb0]|\x9e[\x80-\xb3]|\x9f[\x97\x9c]|\xa0[\xa0-\xbf]|\xa1[\x80-\xb7]|\xa2[\x80-\xa8\xaa\xb0-\xbf]|\xa3[\x80-\xb5]|\xa4[\x80-\x9e]|\xa5[\x90-\xad\xb0-\xb4]|\xa6[\x80-\xab]|\xa7[\x81-\x87]|\xa8[\x80-\x96\xa0-\xbf]|\xa9[\x80-\x94]|\xaa\xa7|\xac[\x85-\xb3]|\xad[\x85-\x8b]|\xae[\x83-\xa0\xae-\xaf\xba-\xbf]|\xaf[\x80-\xa5]|\xb0[\x80-\xa3]|\xb1[\x8d-\x8f\x9a-\xbd]|\xb3[\xa9-\xac\xae-\xb1\xb5-\xb6]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\x95\x98-\x9d\xa0-\xbf]|\xbd[\x80-\x85\x88-\x8d\x90-\x97\x99\x9b\x9d\x9f-\xbd]|\xbe[\x80-\xb4\xb6-\xbc\xbe]|\xbf[\x82-\x84\x86-\x8c\x90-\x93\x96-\x9b\xa0-\xac\xb2-\xb4\xb6-\xbc])|\xe2(\x81[\xb1\xbf]|\x82[\x90-\x9c]|\x84[\x82\x87\x8a-\x93\x95\x99-\x9d\xa4\xa6\xa8\xaa-\xad\xaf-\xb9\xbc-\xbf]|\x85[\x85-\x89\x8e]|\x86[\x83-\x84]|\xb0[\x80-\xae\xb0-\xbf]|\xb1[\x80-\x9e\xa0-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xa4\xab-\xae\xb2-\xb3]|\xb4[\x80-\xa5\xa7\xad\xb0-\xbf]|\xb5[\x80-\xa7\xaf]|\xb6[\x80-\x96\xa0-\xa6\xa8-\xae\xb0-\xb6\xb8-\xbe]|\xb7[\x80-\x86\x88-\x8e\x90-\x96\x98-\x9e]|\xb8\xaf)|\xe3(\x80[\x85-\x86\xb1-\xb5\xbb-\xbc]|\x81[\x81-\xbf]|\x82[\x80-\x96\x9d-\x9f\xa1-\xbf]|\x83[\x80-\xba\xbc-\xbf]|\x84[\x85-\xad\xb1-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\x8e\xa0-\xba]|\x87[\xb0-\xbf]|\x90[\x80-\xa7]))
|
||||
L111 ({L1111}|{L1112})
|
||||
L112 (\xe3(\x90[\xa8-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe4(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xa4]))
|
||||
L11 ({L111}|{L112})
|
||||
L121 (\xe4(\xaf[\xa5-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xb5]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe5(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe6(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xab]))
|
||||
L122 (\xe6(\x8f[\xac-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe7(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xa9]))
|
||||
L12 ({L121}|{L122})
|
||||
L1 ({L11}|{L12})
|
||||
L211 (\xe7(\xae[\xaa-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe8(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xe9(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xa6]))
|
||||
L2121 (\xe9(\x8d[\xa7-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\x84]))
|
||||
L2122 (\xe9(\xbd[\x85-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\x8c])|\xea(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\x8c]|\x93[\x90-\xbd]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\x8c\x90-\x9f\xaa-\xab]|\x99[\x80-\xae\xbf]|\x9a[\x80-\x9d\xa0-\xbf]|\x9b[\x80-\xa5]|\x9c[\x97-\x9f\xa2-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\x88\x8b-\x8e\x90-\xad\xb0-\xb1]|\x9f[\xb7-\xbf]|\xa0[\x80-\x81\x83-\x85\x87-\x8a\x8c-\xa2]|\xa1[\x80-\xb3]|\xa2[\x82-\xb3]|\xa3[\xb2-\xb7\xbb]|\xa4[\x8a-\xa5\xb0-\xbf]|\xa5[\x80-\x86\xa0-\xbc]|\xa6[\x84-\xb2]|\xa7[\x8f\xa0-\xa4\xa6-\xaf\xba-\xbe]|\xa8[\x80-\xa8]|\xa9[\x80-\x82\x84-\x8b\xa0-\xb6\xba\xbe-\xbf]|\xaa[\x80-\xaf\xb1\xb5-\xb6\xb9-\xbd]|\xab[\x80\x82\x9b-\x9d\xa0-\xaa\xb2-\xb4]|\xac[\x81-\x86\x89-\x8e\x91-\x96\xa0-\xa6\xa8-\xae\xb0-\xbf]|\xad[\x80-\x9a\x9c-\x9f\xa4-\xa5]|\xaf[\x80-\xa2]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\x9d]))
|
||||
L212 ({L2121}|{L2122})
|
||||
L21 ({L211}|{L212})
|
||||
L221 (\xea(\xb8[\x9e-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xeb(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xec(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\x9a]))
|
||||
L2221 (\xec(\x97[\x9b-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xed(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xb9]))
|
||||
L2222 (\xed(\x86[\xba-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xa3\xb0-\xbf]|\x9f[\x80-\x86\x8b-\xbb])|\xef(\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xad\xb0-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\x99]|\xac[\x80-\x86\x93-\x97\x9d\x9f-\xa8\xaa-\xb6\xb8-\xbc\xbe]|\xad[\x80-\x81\x83-\x84\x86-\xbf]|\xae[\x80-\xb1]|\xaf[\x93-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbd]|\xb5[\x90-\xbf]|\xb6[\x80-\x8f\x92-\xbf]|\xb7[\x80-\x87\xb0-\xbb]|\xb9[\xb0-\xb4\xb6-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbc]|\xbc[\xa1-\xba]|\xbd[\x81-\x9a\xa6-\xbf]|\xbe[\x80-\xbe]|\xbf[\x82-\x87\x8a-\x8f\x92-\x97\x9a-\x9c])|\xf0(\x90(\xa0[\x88\xbc]|\xa8\x80)|\x91(\x85\xb6|\x87\x9a|\x8c\xbd|\x93\x87|\x99\x84|\xa3\xbf)|\x96(\xbd\x90)|\x9d(\x92[\x9c\xa2\xbb]|\x95\x86|\x9f[\x8a-\x8b])|\x9e(\xb8[\xa4\xa7\xb9\xbb]|\xb9[\x82\x87\x89\x8b\x94\x97\x99\x9b\x9d\x9f\xa4\xbe])))
|
||||
L222 ({L2221}|{L2222})
|
||||
L22 ({L221}|{L222})
|
||||
L2 ({L21}|{L22})
|
||||
L ({L1}|{L2})
|
||||
C1111 ([\x00-\x1f\x7f]|\xc2[\x80-\x9f\xad]|\xcd[\xb8-\xb9]|\xce[\x80-\x83\x8b\x8d\xa2]|\xd4\xb0|\xd5[\x97-\x98\xa0]|\xd6[\x88\x8b-\x8c\x90]|\xd7[\x88-\x8f\xab-\xaf\xb5-\xbf]|\xd8[\x80-\x85\x9c-\x9d]|\xdb\x9d|\xdc[\x8e-\x8f]|\xdd[\x8b-\x8c]|\xde[\xb2-\xbf]|\xdf[\xbb-\xbf]|\xe0(\xa0[\xae-\xaf\xbf]|\xa1[\x9c-\x9d\x9f-\xbf]|\xa2[\x80-\x9f\xb3-\xbf]|\xa3[\x80-\xa3]|\xa6[\x84\x8d-\x8e\x91-\x92\xa9\xb1\xb3-\xb5\xba-\xbb]|\xa7[\x85-\x86\x89-\x8a\x8f-\x96\x98-\x9b\x9e\xa4-\xa5\xbc-\xbf]|\xa8[\x80\x84\x8b-\x8e\x91-\x92\xa9\xb1\xb4\xb7\xba-\xbb\xbd]|\xa9[\x83-\x86\x89-\x8a\x8e-\x90\x92-\x98\x9d\x9f-\xa5\xb6-\xbf]|\xaa[\x80\x84\x8e\x92\xa9\xb1\xb4\xba-\xbb]|\xab[\x86\x8a\x8e-\x8f\x91-\x9f\xa4-\xa5\xb2-\xbf]|\xac[\x80\x84\x8d-\x8e\x91-\x92\xa9\xb1\xb4\xba-\xbb]|\xad[\x85-\x86\x89-\x8a\x8e-\x95\x98-\x9b\x9e\xa4-\xa5\xb8-\xbf]|\xae[\x80-\x81\x84\x8b-\x8d\x91\x96-\x98\x9b\x9d\xa0-\xa2\xa5-\xa7\xab-\xad\xba-\xbd]|\xaf[\x83-\x85\x89\x8e-\x8f\x91-\x96\x98-\xa5\xbb-\xbf]|\xb0[\x84\x8d\x91\xa9\xba-\xbc]|\xb1[\x85\x89\x8e-\x94\x97\x9a-\x9f\xa4-\xa5\xb0-\xb7]|\xb2[\x80\x84\x8d\x91\xa9\xb4\xba-\xbb]|\xb3[\x85\x89\x8e-\x94\x97-\x9d]))
|
||||
C1112 (\xe0(\xb3[\x9f\xa4-\xa5\xb0\xb3-\xbf]|\xb4[\x80\x84\x8d\x91\xbb-\xbc]|\xb5[\x85\x89\x8f-\x96\x98-\x9f\xa4-\xa5\xb6-\xb8]|\xb6[\x80-\x81\x84\x97-\x99\xb2\xbc\xbe-\xbf]|\xb7[\x87-\x89\x8b-\x8e\x95\x97\xa0-\xa5\xb0-\xb1\xb5-\xbf]|\xb8[\x80\xbb-\xbe]|\xb9[\x9c-\xbf]|\xba[\x80\x83\x85-\x86\x89\x8b-\x8c\x8e-\x93\x98\xa0\xa4\xa6\xa8-\xa9\xac\xba\xbe-\xbf]|\xbb[\x85\x87\x8e-\x8f\x9a-\x9b\xa0-\xbf]|\xbd[\x88\xad-\xb0]|\xbe[\x98\xbd]|\xbf[\x8d\x9b-\xbf])|\xe1(\x83[\x86\x88-\x8c\x8e-\x8f]|\x89[\x89\x8e-\x8f\x97\x99\x9e-\x9f]|\x8a[\x89\x8e-\x8f\xb1\xb6-\xb7\xbf]|\x8b[\x81\x86-\x87\x97]|\x8c[\x91\x96-\x97]|\x8d[\x9b-\x9c\xbd-\xbf]|\x8e[\x9a-\x9f]|\x8f[\xb5-\xbf]|\x9a[\x9d-\x9f]|\x9b[\xb9-\xbf]|\x9c[\x8d\x95-\x9f\xb7-\xbf]|\x9d[\x94-\x9f\xad\xb1\xb4-\xbf]|\x9f[\x9e-\x9f\xaa-\xaf\xba-\xbf]|\xa0[\x8e-\x8f\x9a-\x9f]|\xa1[\xb8-\xbf]|\xa2[\xab-\xaf]|\xa3[\xb6-\xbf]|\xa4[\x9f\xac-\xaf\xbc-\xbf]|\xa5[\x81-\x83\xae-\xaf\xb5-\xbf]|\xa6[\xac-\xaf]|\xa7[\x8a-\x8f\x9b-\x9d]|\xa8[\x9c-\x9d]|\xa9[\x9f\xbd-\xbe]|\xaa[\x8a-\x8f\x9a-\x9f\xae-\xaf\xbf]|\xab[\x80-\xbf]|\xad[\x8c-\x8f\xbd-\xbf]|\xaf[\xb4-\xbb]|\xb0[\xb8-\xba]|\xb1[\x8a-\x8c]|\xb2[\x80-\x8a]))
|
||||
C111 ({C1111}|{C1112})
|
||||
C112 (\xe1(\xb2[\x8b-\xbf]|\xb3[\x88-\x8f\xb7\xba-\xbf]|\xb7[\xb6-\xbb]|\xbc[\x96-\x97\x9e-\x9f]|\xbd[\x86-\x87\x8e-\x8f\x98\x9a\x9c\x9e\xbe-\xbf]|\xbe\xb5|\xbf[\x85\x94-\x95\x9c\xb0-\xb1\xb5\xbf])|\xe2(\x80[\x8b-\x8f\xaa-\xae]|\x81[\xa0-\xaf\xb2-\xb3]|\x82[\x8f\x9d-\x9f\xbe-\xbf]|\x83[\x80-\x8f\xb1-\xbf]|\x86[\x8a-\x8f]|\x8f[\xbb-\xbf]|\x90[\xa7-\xbf]|\x91[\x8b-\x9f]|\xad[\xb4-\xb5]|\xae[\x96-\x97\xba-\xbc]|\xaf[\x89\x92-\xbf]|\xb0\xaf|\xb1\x9f|\xb3[\xb4-\xb8]|\xb4[\xa6\xa8-\xac\xae-\xaf]|\xb5[\xa8-\xae\xb1-\xbe]|\xb6[\x97-\x9f\xa7\xaf\xb7\xbf]|\xb7[\x87\x8f\x97\x9f]|\xb9[\x83-\xbf]|\xba\x9a|\xbb[\xb4-\xbf]|\xbf[\x96-\xaf\xbc-\xbf])|\xe3(\x81\x80|\x82[\x97-\x98]|\x84[\x80-\x84\xae-\xb0]|\x86[\x8f\xbb-\xbf]|\x87[\xa4-\xaf]|\x88\x9f|\x8b\xbf)|\xe4(\xb6[\xb6-\xbf])|\xe9(\xbf[\x8d-\xbf])|\xea(\x92[\x8d-\x8f]|\x93[\x87-\x8f]|\x98[\xac-\xbf]|\x9a\x9e|\x9b[\xb8-\xbf]|\x9e[\x8f\xae-\xaf\xb2-\xbf]|\x9f[\x80-\xb6]|\xa0[\xac-\xaf\xba-\xbf]|\xa1[\xb8-\xbf]|\xa3[\x85-\x8d\x9a-\x9f\xbc-\xbf]|\xa5[\x94-\x9e\xbd-\xbf]|\xa7[\x8e\x9a-\x9d\xbf]|\xa8[\xb7-\xbf]|\xa9[\x8e-\x8f\x9a-\x9b]|\xab[\x83-\x9a\xb7-\xbf]|\xac[\x80\x87-\x88\x8f-\x90\x97-\x9f\xa7\xaf]|\xad[\xa0-\xa3\xa6-\xbf]|\xae[\x80-\xbf]|\xaf[\xae-\xaf\xba-\xbf])|\xed(\x9e[\xa4-\xaf]|\x9f[\x87-\x8a\xbc-\xbf])|\xee(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\x87]))
|
||||
C11 ({C111}|{C112})
|
||||
C12 (\xee(\x83[\x88-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xae]))
|
||||
C1 ({C11}|{C12})
|
||||
C2 (\xee(\xa4[\xaf-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\xbf]|\xa7[\x80-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xbf]|\xae[\x80-\xbf]|\xaf[\x80-\xbf]|\xb0[\x80-\xbf]|\xb1[\x80-\xbf]|\xb2[\x80-\xbf]|\xb3[\x80-\xbf]|\xb4[\x80-\xbf]|\xb5[\x80-\xbf]|\xb6[\x80-\xbf]|\xb7[\x80-\xbf]|\xb8[\x80-\xbf]|\xb9[\x80-\xbf]|\xba[\x80-\xbf]|\xbb[\x80-\xbf]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\xbf])|\xef(\x80[\x80-\xbf]|\x81[\x80-\xbf]|\x82[\x80-\xbf]|\x83[\x80-\xbf]|\x84[\x80-\xbf]|\x85[\x80-\xbf]|\x86[\x80-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf]|\x90[\x80-\xbf]|\x91[\x80-\xbf]|\x92[\x80-\xbf]|\x93[\x80-\xbf]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xbf]|\x9e[\x80-\xbf]|\x9f[\x80-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\xbf]|\xa3[\x80-\xbf]|\xa9[\xae-\xaf]|\xab[\x9a-\xbf]|\xac[\x87-\x92\x98-\x9c\xb7\xbd\xbf]|\xad[\x82\x85]|\xaf[\x82-\x92]|\xb5[\x80-\x8f]|\xb6[\x90-\x91]|\xb7[\x88-\xaf\xbe-\xbf]|\xb8[\x9a-\x9f\xae-\xaf]|\xb9[\x93\xa7\xac-\xaf\xb5]|\xbb[\xbd-\xbf]|\xbc\x80|\xbe\xbf|\xbf[\x80-\x81\x88-\x89\x90-\x91\x98-\x99\x9d-\x9f\xa7\xaf-\xbb\xbe-\xbf])|\xf0(\x90(\x80[\x8c\xa7\xbb\xbe]|\x8e\x9e|\xa0[\x89\xb6]|\xa1\x96|\xa8[\x84\x94\x98])|\x91(\x82\xbd|\x84\xb5|\x88\x92|\x8c[\x84\xa9\xb1\xb4])|\x92(\x91\xaf)|\x96(\xa9\x9f|\xad[\x9a\xa2])|\x9d(\x91\x95|\x92[\x9d\xad\xba\xbc]|\x93\x84|\x94[\x86\x95\x9d\xba\xbf]|\x95[\x85\x91])|\x9e(\xb8[\x84\xa0\xa3\xa8\xb3\xb8\xba]|\xb9[\x88\x8a\x8c\x90\x93\x98\x9a\x9c\x9e\xa0\xa3\xab\xb3\xb8\xbd\xbf]|\xba[\x8a\xa4\xaa])|\x9f(\x83[\x80\x90]|\x84\xaf|\x93\xbf|\x95\xba|\x96\xa4))|\xf3(\xa0(\x80\x81)))
|
||||
C ({C1}|{C2})
|
||||
M1 (\xcc[\x80-\xbf]|\xcd[\x80-\xaf]|\xd2[\x83-\x89]|\xd6[\x91-\xbd\xbf]|\xd7[\x81-\x82\x84-\x85\x87]|\xd8[\x90-\x9a]|\xd9[\x8b-\x9f\xb0]|\xdb[\x96-\x9c\x9f-\xa4\xa7-\xa8\xaa-\xad]|\xdc[\x91\xb0-\xbf]|\xdd[\x80-\x8a]|\xde[\xa6-\xb0]|\xdf[\xab-\xb3]|\xe0(\xa0[\x96-\x99\x9b-\xa3\xa5-\xa7\xa9-\xad]|\xa1[\x99-\x9b]|\xa3[\xa4-\xbf]|\xa4[\x80-\x83\xba-\xbc\xbe-\xbf]|\xa5[\x80-\x8f\x91-\x97\xa2-\xa3]|\xa6[\x81-\x83\xbc\xbe-\xbf]|\xa7[\x80-\x84\x87-\x88\x8b-\x8d\x97\xa2-\xa3]|\xa8[\x81-\x83\xbc\xbe-\xbf]|\xa9[\x80-\x82\x87-\x88\x8b-\x8d\x91\xb0-\xb1\xb5]|\xaa[\x81-\x83\xbc\xbe-\xbf]|\xab[\x80-\x85\x87-\x89\x8b-\x8d\xa2-\xa3]|\xac[\x81-\x83\xbc\xbe-\xbf]|\xad[\x80-\x84\x87-\x88\x8b-\x8d\x96-\x97\xa2-\xa3]|\xae[\x82\xbe-\xbf]|\xaf[\x80-\x82\x86-\x88\x8a-\x8d\x97]|\xb0[\x80-\x83\xbe-\xbf]|\xb1[\x80-\x84\x86-\x88\x8a-\x8d\x95-\x96\xa2-\xa3]|\xb2[\x81-\x83\xbc\xbe-\xbf]|\xb3[\x80-\x84\x86-\x88\x8a-\x8d\x95-\x96\xa2-\xa3]|\xb4[\x81-\x83\xbe-\xbf]|\xb5[\x80-\x84\x86-\x88\x8a-\x8d\x97\xa2-\xa3]|\xb6[\x82-\x83]|\xb7[\x8a\x8f-\x94\x96\x98-\x9f\xb2-\xb3]|\xb8[\xb1\xb4-\xba]|\xb9[\x87-\x8e]|\xba[\xb1\xb4-\xb9\xbb-\xbc]|\xbb[\x88-\x8d]|\xbc[\x98-\x99\xb5\xb7\xb9\xbe-\xbf]|\xbd[\xb1-\xbf]|\xbe[\x80-\x84\x86-\x87\x8d-\x97\x99-\xbc]|\xbf\x86)|\xe1(\x80[\xab-\xb6]))
|
||||
M2 (\xe1(\x80[\xb7-\xbe]|\x81[\x96-\x99\x9e-\xa0\xa2-\xa4\xa7-\xad\xb1-\xb4]|\x82[\x82-\x8d\x8f\x9a-\x9d]|\x8d[\x9d-\x9f]|\x9c[\x92-\x94\xb2-\xb4]|\x9d[\x92-\x93\xb2-\xb3]|\x9e[\xb4-\xbf]|\x9f[\x80-\x93\x9d]|\xa0[\x8b-\x8d]|\xa2\xa9|\xa4[\xa0-\xab\xb0-\xbb]|\xa6[\xb0-\xbf]|\xa7[\x80\x88-\x89]|\xa8[\x97-\x9b]|\xa9[\x95-\x9e\xa0-\xbc\xbf]|\xaa[\xb0-\xbe]|\xac[\x80-\x84\xb4-\xbf]|\xad[\x80-\x84\xab-\xb3]|\xae[\x80-\x82\xa1-\xad]|\xaf[\xa6-\xb3]|\xb0[\xa4-\xb7]|\xb3[\x90-\x92\x94-\xa8\xad\xb2-\xb4\xb8-\xb9]|\xb7[\x80-\xb5\xbc-\xbf])|\xe2(\x83[\x90-\xb0]|\xb3[\xaf-\xb1]|\xb5\xbf|\xb7[\xa0-\xbf])|\xe3(\x80[\xaa-\xaf]|\x82[\x99-\x9a])|\xea(\x99[\xaf-\xb2\xb4-\xbd]|\x9a\x9f|\x9b[\xb0-\xb1]|\xa0[\x82\x86\x8b\xa3-\xa7]|\xa2[\x80-\x81\xb4-\xbf]|\xa3[\x80-\x84\xa0-\xb1]|\xa4[\xa6-\xad]|\xa5[\x87-\x93]|\xa6[\x80-\x83\xb3-\xbf]|\xa7[\x80\xa5]|\xa8[\xa9-\xb6]|\xa9[\x83\x8c-\x8d\xbb-\xbd]|\xaa[\xb0\xb2-\xb4\xb7-\xb8\xbe-\xbf]|\xab[\x81\xab-\xaf\xb5-\xb6]|\xaf[\xa3-\xaa\xac-\xad])|\xef(\xac\x9e|\xb8[\x80-\x8f\xa0-\xad])|\xf0(\x90(\x87\xbd|\x8b\xa0|\xa8\xbf)|\x91(\x80[\x80-\x82]|\x82\x82|\x84\xac|\x85\xb3|\x86\x82|\x88[\xb4-\xb5]|\x8b\x9f|\x8c[\x81\xbc]|\x8d[\x80\x97]|\x92[\xb9-\xba]|\x93\x81|\x96\xbe|\x98[\xbd-\xbe]|\x9a[\xab-\xad\xb6-\xb7])))
|
||||
M ({M1}|{M2})
|
||||
N ([0-9]|\xc2[\xb2-\xb3\xb9\xbc-\xbe]|\xd9[\xa0-\xa9]|\xdb[\xb0-\xb9]|\xdf[\x80-\x89]|\xe0(\xa5[\xa6-\xaf]|\xa7[\xa6-\xaf\xb4-\xb9]|\xa9[\xa6-\xaf]|\xab[\xa6-\xaf]|\xad[\xa6-\xaf\xb2-\xb7]|\xaf[\xa6-\xb2]|\xb1[\xa6-\xaf\xb8-\xbe]|\xb3[\xa6-\xaf]|\xb5[\xa6-\xb5]|\xb7[\xa6-\xaf]|\xb9[\x90-\x99]|\xbb[\x90-\x99]|\xbc[\xa0-\xb3])|\xe1(\x81[\x80-\x89]|\x82[\x90-\x99]|\x8d[\xa9-\xbc]|\x9b[\xae-\xb0]|\x9f[\xa0-\xa9\xb0-\xb9]|\xa0[\x90-\x99]|\xa5[\x86-\x8f]|\xa7[\x90-\x9a]|\xaa[\x80-\x89\x90-\x99]|\xad[\x90-\x99]|\xae[\xb0-\xb9]|\xb1[\x80-\x89\x90-\x99])|\xe2(\x81[\xb0\xb4-\xb9]|\x82[\x80-\x89]|\x85[\x90-\xbf]|\x86[\x80-\x82\x85-\x89]|\x91[\xa0-\xbf]|\x92[\x80-\x9b]|\x93[\xaa-\xbf]|\x9d[\xb6-\xbf]|\x9e[\x80-\x93]|\xb3\xbd)|\xe3(\x80[\x87\xa1-\xa9\xb8-\xba]|\x86[\x92-\x95]|\x88[\xa0-\xa9]|\x89[\x88-\x8f\x91-\x9f]|\x8a[\x80-\x89\xb1-\xbf])|\xea(\x98[\xa0-\xa9]|\x9b[\xa6-\xaf]|\xa0[\xb0-\xb5]|\xa3[\x90-\x99]|\xa4[\x80-\x89]|\xa7[\x90-\x99\xb0-\xb9]|\xa9[\x90-\x99]|\xaf[\xb0-\xb9])|\xef(\xbc[\x90-\x99])|\xf0(\x90(\x8d[\x81\x8a])))
|
||||
P ([!-\#%-\*,-\/\:-;\?-@\[-\]_\{\}]|\xc2[\xa1\xa7\xab\xb6-\xb7\xbb\xbf]|\xcd\xbe|\xce\x87|\xd5[\x9a-\x9f]|\xd6[\x89-\x8a\xbe]|\xd7[\x80\x83\x86\xb3-\xb4]|\xd8[\x89-\x8a\x8c-\x8d\x9b\x9e-\x9f]|\xd9[\xaa-\xad]|\xdb\x94|\xdc[\x80-\x8d]|\xdf[\xb7-\xb9]|\xe0(\xa0[\xb0-\xbe]|\xa1\x9e|\xa5[\xa4-\xa5\xb0]|\xab\xb0|\xb7\xb4|\xb9[\x8f\x9a-\x9b]|\xbc[\x84-\x92\x94\xba-\xbd]|\xbe\x85|\xbf[\x90-\x94\x99-\x9a])|\xe1(\x81[\x8a-\x8f]|\x83\xbb|\x8d[\xa0-\xa8]|\x90\x80|\x99[\xad-\xae]|\x9a[\x9b-\x9c]|\x9b[\xab-\xad]|\x9c[\xb5-\xb6]|\x9f[\x94-\x96\x98-\x9a]|\xa0[\x80-\x8a]|\xa5[\x84-\x85]|\xa8[\x9e-\x9f]|\xaa[\xa0-\xa6\xa8-\xad]|\xad[\x9a-\xa0]|\xaf[\xbc-\xbf]|\xb0[\xbb-\xbf]|\xb1[\xbe-\xbf]|\xb3[\x80-\x87\x93])|\xe2(\x80[\x90-\xa7\xb0-\xbf]|\x81[\x80-\x83\x85-\x91\x93-\x9e\xbd-\xbe]|\x82[\x8d-\x8e]|\x8c[\x88-\x8b\xa9-\xaa]|\x9d[\xa8-\xb5]|\x9f[\x85-\x86\xa6-\xaf]|\xa6[\x83-\x98]|\xa7[\x98-\x9b\xbc-\xbd]|\xb3[\xb9-\xbc\xbe-\xbf]|\xb5\xb0|\xb8[\x80-\xae\xb0-\xbf]|\xb9[\x80-\x82])|\xe3(\x80[\x81-\x83\x88-\x91\x94-\x9f\xb0\xbd]|\x82\xa0|\x83\xbb)|\xea(\x93[\xbe-\xbf]|\x98[\x8d-\x8f]|\x99[\xb3\xbe]|\x9b[\xb2-\xb7]|\xa1[\xb4-\xb7]|\xa3[\x8e-\x8f\xb8-\xba]|\xa4[\xae-\xaf]|\xa5\x9f|\xa7[\x81-\x8d\x9e-\x9f]|\xa9[\x9c-\x9f]|\xab[\x9e-\x9f\xb0-\xb1]|\xaf\xab)|\xef(\xb4[\xbe-\xbf]|\xb8[\x90-\x99\xb0-\xbf]|\xb9[\x80-\x92\x94-\xa1\xa3\xa8\xaa-\xab]|\xbc[\x81-\x83\x85-\x8a\x8c-\x8f\x9a-\x9b\x9f-\xa0\xbb-\xbd\xbf]|\xbd[\x9b\x9d\x9f-\xa5])|\xf0(\x90(\x8e\x9f|\x8f\x90|\x95\xaf|\xa1\x97|\xa4[\x9f\xbf]|\xa9\xbf)|\x91(\x87\x8d|\x93\x86)|\x96(\xab\xb5|\xad\x84)|\x9b(\xb2\x9f)))
|
||||
S1 ([\$\+<->\^`\|~]|\xc2[\xa2-\xa6\xa8-\xa9\xac\xae-\xb1\xb4\xb8]|\xc3[\x97\xb7]|\xcb[\x82-\x85\x92-\x9f\xa5-\xab\xad\xaf-\xbf]|\xcd\xb5|\xce[\x84-\x85]|\xcf\xb6|\xd2\x82|\xd6[\x8d-\x8f]|\xd8[\x86-\x88\x8b\x8e-\x8f]|\xdb[\x9e\xa9\xbd-\xbe]|\xdf\xb6|\xe0(\xa7[\xb2-\xb3\xba-\xbb]|\xab\xb1|\xad\xb0|\xaf[\xb3-\xba]|\xb1\xbf|\xb5\xb9|\xb8\xbf|\xbc[\x81-\x83\x93\x95-\x97\x9a-\x9f\xb4\xb6\xb8]|\xbe[\xbe-\xbf]|\xbf[\x80-\x85\x87-\x8c\x8e-\x8f\x95-\x98])|\xe1(\x82[\x9e-\x9f]|\x8e[\x90-\x99]|\x9f\x9b|\xa5\x80|\xa7[\x9e-\xbf]|\xad[\xa1-\xaa\xb4-\xbc]|\xbe[\xbd\xbf]|\xbf[\x80-\x81\x8d-\x8f\x9d-\x9f\xad-\xaf\xbd-\xbe])|\xe2(\x81[\x84\x92\xba-\xbc]|\x82[\x8a-\x8c\xa0-\xbd]|\x84[\x80-\x81\x83-\x86\x88-\x89\x94\x96-\x98\x9e-\xa3\xa5\xa7\xa9\xae\xba-\xbb]|\x85[\x80-\x84\x8a-\x8d\x8f]|\x86[\x90-\xbf]|\x87[\x80-\xbf]|\x88[\x80-\xbf]|\x89[\x80-\xbf]|\x8a[\x80-\xbf]|\x8b[\x80-\xbf]|\x8c[\x80-\x87\x8c-\xa8\xab-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xba]|\x90[\x80-\xa6]|\x91[\x80-\x8a]|\x92[\x9c-\xbf]|\x93[\x80-\xa9]|\x94[\x80-\xbf]|\x95[\x80-\xbf]|\x96[\x80-\xbf]|\x97[\x80-\xbf]|\x98[\x80-\xbf]|\x99[\x80-\xbf]|\x9a[\x80-\xbf]|\x9b[\x80-\xbf]|\x9c[\x80-\xbf]|\x9d[\x80-\xa7]|\x9e[\x94-\xbf]|\x9f[\x80-\x84\x87-\xa5\xb0-\xbf]|\xa0[\x80-\xbf]|\xa1[\x80-\xbf]|\xa2[\x80-\x88]))
|
||||
S2 (\xe2(\xa2[\x89-\xbf]|\xa3[\x80-\xbf]|\xa4[\x80-\xbf]|\xa5[\x80-\xbf]|\xa6[\x80-\x82\x99-\xbf]|\xa7[\x80-\x97\x9c-\xbb\xbe-\xbf]|\xa8[\x80-\xbf]|\xa9[\x80-\xbf]|\xaa[\x80-\xbf]|\xab[\x80-\xbf]|\xac[\x80-\xbf]|\xad[\x80-\xb3\xb6-\xbf]|\xae[\x80-\x95\x98-\xb9\xbd-\xbf]|\xaf[\x80-\x88\x8a-\x91]|\xb3[\xa5-\xaa]|\xba[\x80-\x99\x9b-\xbf]|\xbb[\x80-\xb3]|\xbc[\x80-\xbf]|\xbd[\x80-\xbf]|\xbe[\x80-\xbf]|\xbf[\x80-\x95\xb0-\xbb])|\xe3(\x80[\x84\x92-\x93\xa0\xb6-\xb7\xbe-\xbf]|\x82[\x9b-\x9c]|\x86[\x90-\x91\x96-\x9f]|\x87[\x80-\xa3]|\x88[\x80-\x9e\xaa-\xbf]|\x89[\x80-\x87\x90\xa0-\xbf]|\x8a[\x8a-\xb0]|\x8b[\x80-\xbe]|\x8c[\x80-\xbf]|\x8d[\x80-\xbf]|\x8e[\x80-\xbf]|\x8f[\x80-\xbf])|\xe4(\xb7[\x80-\xbf])|\xea(\x92[\x90-\xbf]|\x93[\x80-\x86]|\x9c[\x80-\x96\xa0-\xa1]|\x9e[\x89-\x8a]|\xa0[\xa8-\xab\xb6-\xb9]|\xa9[\xb7-\xb9]|\xad\x9b)|\xef(\xac\xa9|\xae[\xb2-\xbf]|\xaf[\x80-\x81]|\xb7[\xbc-\xbd]|\xb9[\xa2\xa4-\xa6\xa9]|\xbc[\x84\x8b\x9c-\x9e\xbe]|\xbd[\x80\x9c\x9e]|\xbf[\xa0-\xa6\xa8-\xae\xbc-\xbd])|\xf0(\x90(\x86[\x8c\xa0]|\xab\x88)|\x96(\xad\x85)|\x9b(\xb2\x9c)|\x9d(\x89\x85|\x9b[\x81\x9b\xbb]|\x9c[\x95\xb5]|\x9d[\x8f\xaf]|\x9e[\x89\xa9]|\x9f\x83)))
|
||||
S ({S1}|{S2})
|
||||
Z (\x20|\xc2\xa0|\xe1(\x9a\x80)|\xe2(\x80[\x80-\x8a\xa8-\xa9\xaf]|\x81\x9f)|\xe3(\x80\x80))
|
||||
|
||||
DIGIT [0-9]
|
||||
EXPO [eE][-+]?[0-9]+
|
||||
|
||||
%% /*** Filter language Part ***/
|
||||
|
||||
[ \t]+ COUNT;
|
||||
[\n] column = 0;
|
||||
|
||||
\<\<(\\(.|\n)|[^\\>\n])*\>\> COUNT; yylval.string = unquote(yytext); return STRING;
|
||||
|
||||
[+()=/*^,\.\{\}\[\]:;@\?#] COUNT; return *yytext;
|
||||
|
||||
"==" COUNT; return EQ;
|
||||
"!=" COUNT; return NEQ;
|
||||
">" COUNT; return GT;
|
||||
"<" COUNT; return LT;
|
||||
">=" COUNT; return GTE;
|
||||
"<=" COUNT; return LTE;
|
||||
|
||||
"-" COUNT; return MINUSSIGN;
|
||||
"\xe2\x88\x92" COUNT; return MINUSSIGN;
|
||||
|
||||
"nm" COUNT; yylval.quantity.scaler = Quantity::NanoMetre; yylval.quantity.unitStr = yytext; return UNIT; // nano meter
|
||||
"um" COUNT; yylval.quantity.scaler = Quantity::MicroMetre; yylval.quantity.unitStr = yytext; return UNIT; // micro meter
|
||||
"\xC2\xB5m" COUNT; yylval.quantity.scaler = Quantity::MicroMetre; yylval.quantity.unitStr = yytext; return UNIT; // micro meter (greek micro in UTF8)
|
||||
"mm" COUNT; yylval.quantity.scaler = Quantity::MilliMetre; yylval.quantity.unitStr = yytext; return UNIT; // milli meter (internal standard length)
|
||||
"cm" COUNT; yylval.quantity.scaler = Quantity::CentiMetre; yylval.quantity.unitStr = yytext; return UNIT; // centi meter
|
||||
"dm" COUNT; yylval.quantity.scaler = Quantity::DeciMetre; yylval.quantity.unitStr = yytext; return UNIT; // deci meter
|
||||
"m" COUNT; yylval.quantity.scaler = Quantity::Metre; yylval.quantity.unitStr = yytext; return UNIT; // metre
|
||||
"km" COUNT; yylval.quantity.scaler = Quantity::KiloMetre; yylval.quantity.unitStr = yytext; return UNIT; // kilo meter
|
||||
|
||||
"l" COUNT; yylval.quantity.scaler = Quantity::Liter; yylval.quantity.unitStr = yytext; return UNIT; // Liter dm^3
|
||||
|
||||
"ug" COUNT; yylval.quantity.scaler = Quantity::MicroGram; yylval.quantity.unitStr = yytext; return UNIT; // micro gram
|
||||
"\xC2\xB5g" COUNT; yylval.quantity.scaler = Quantity::MicroGram; yylval.quantity.unitStr = yytext; return UNIT; // micro gram
|
||||
"mg" COUNT; yylval.quantity.scaler = Quantity::MilliGram; yylval.quantity.unitStr = yytext; return UNIT; // milli gram
|
||||
"g" COUNT; yylval.quantity.scaler = Quantity::Gram; yylval.quantity.unitStr = yytext; return UNIT; // gram
|
||||
"kg" COUNT; yylval.quantity.scaler = Quantity::KiloGram; yylval.quantity.unitStr = yytext; return UNIT; // kilo gram (internal standard for mass)
|
||||
"t" COUNT; yylval.quantity.scaler = Quantity::Ton; yylval.quantity.unitStr = yytext; return UNIT; // Metric Tonne
|
||||
|
||||
"s" COUNT; yylval.quantity.scaler = Quantity::Second; yylval.quantity.unitStr = yytext; return UNIT; // second (internal standard time)
|
||||
"min" COUNT; yylval.quantity.scaler = Quantity::Minute; yylval.quantity.unitStr = yytext; return UNIT; // minute
|
||||
"h" COUNT; yylval.quantity.scaler = Quantity::Hour; yylval.quantity.unitStr = yytext; return UNIT; // hour
|
||||
|
||||
"A" COUNT; yylval.quantity.scaler = Quantity::Ampere; yylval.quantity.unitStr = yytext; return UNIT; // Ampere (internal standard electric current)
|
||||
"mA" COUNT; yylval.quantity.scaler = Quantity::MilliAmpere; yylval.quantity.unitStr = yytext; return UNIT; // milli Ampere
|
||||
"kA" COUNT; yylval.quantity.scaler = Quantity::KiloAmpere; yylval.quantity.unitStr = yytext; return UNIT; // kilo Ampere
|
||||
"MA" COUNT; yylval.quantity.scaler = Quantity::MegaAmpere; yylval.quantity.unitStr = yytext; return UNIT; // Mega Ampere
|
||||
|
||||
"K" COUNT; yylval.quantity.scaler = Quantity::Kelvin; yylval.quantity.unitStr = yytext; return UNIT; // Kelvin (internal standard thermodynamic temperature)
|
||||
"mK" COUNT; yylval.quantity.scaler = Quantity::MilliKelvin; yylval.quantity.unitStr = yytext; return UNIT; // Kelvin
|
||||
"\xC2\xB5K" COUNT; yylval.quantity.scaler = Quantity::MicroKelvin; yylval.quantity.unitStr = yytext; return UNIT; // Kelvin
|
||||
"uK" COUNT; yylval.quantity.scaler = Quantity::MicroKelvin; yylval.quantity.unitStr = yytext; return UNIT; // Kelvin
|
||||
|
||||
"mol" COUNT; yylval.quantity.scaler = Quantity::Mole; yylval.quantity.unitStr = yytext; return UNIT; // Mole (internal standard amount of substance)
|
||||
|
||||
"cd" COUNT; yylval.quantity.scaler = Quantity::Candela; yylval.quantity.unitStr = yytext; return UNIT; // Candela (internal standard luminous intensity)
|
||||
|
||||
"in" COUNT; yylval.quantity.scaler = Quantity::Inch; yylval.quantity.unitStr = yytext; return UNIT; // inch
|
||||
"\"" COUNT; yylval.quantity.scaler = Quantity::Inch; yylval.quantity.unitStr = yytext; return UNIT; // inch
|
||||
"ft" COUNT; yylval.quantity.scaler = Quantity::Foot; yylval.quantity.unitStr = yytext; return UNIT; // foot
|
||||
"'" COUNT; yylval.quantity.scaler = Quantity::Foot; yylval.quantity.unitStr = yytext; return UNIT; // foot
|
||||
"thou" COUNT; yylval.quantity.scaler = Quantity::Thou; yylval.quantity.unitStr = yytext; return UNIT; // thou (in/1000)
|
||||
"mil" COUNT; yylval.quantity.scaler = Quantity::Thou; yylval.quantity.unitStr = yytext; return UNIT; // mil (the thou in US)
|
||||
"yd" COUNT; yylval.quantity.scaler = Quantity::Yard; yylval.quantity.unitStr = yytext; return UNIT; // yard
|
||||
"mi" COUNT; yylval.quantity.scaler = Quantity::Mile; yylval.quantity.unitStr = yytext; return UNIT; // mile
|
||||
|
||||
|
||||
|
||||
"lb" COUNT; yylval.quantity.scaler = Quantity::Pound; yylval.quantity.unitStr = yytext; return UNIT; // pound
|
||||
"lbm" COUNT; yylval.quantity.scaler = Quantity::Pound; yylval.quantity.unitStr = yytext; return UNIT; // pound
|
||||
"oz" COUNT; yylval.quantity.scaler = Quantity::Ounce; yylval.quantity.unitStr = yytext; return UNIT; // ounce
|
||||
"st" COUNT; yylval.quantity.scaler = Quantity::Stone; yylval.quantity.unitStr = yytext; return UNIT; // Stone
|
||||
"cwt" COUNT; yylval.quantity.scaler = Quantity::Hundredweights; yylval.quantity.unitStr = yytext; return UNIT; // hundredweights
|
||||
|
||||
"lbf" COUNT; yylval.quantity.scaler = Quantity::PoundForce; yylval.quantity.unitStr = yytext; return UNIT; // pound
|
||||
|
||||
"N" COUNT; yylval.quantity.scaler = Quantity::Newton; yylval.quantity.unitStr = yytext; return UNIT; // Newton (kg*m/s^2)a-za-za-z
|
||||
"kN" COUNT; yylval.quantity.scaler = Quantity::KiloNewton; yylval.quantity.unitStr = yytext; return UNIT; // Newton
|
||||
"MN" COUNT; yylval.quantity.scaler = Quantity::MegaNewton; yylval.quantity.unitStr = yytext; return UNIT; // Newton
|
||||
"mN" COUNT; yylval.quantity.scaler = Quantity::MilliNewton; yylval.quantity.unitStr = yytext; return UNIT; // Newton
|
||||
|
||||
"Pa" COUNT; yylval.quantity.scaler = Quantity::Pascal; yylval.quantity.unitStr = yytext; return UNIT; // Pascal (kg/m*s^2 or N/m^2)
|
||||
"kPa" COUNT; yylval.quantity.scaler = Quantity::KiloPascal; yylval.quantity.unitStr = yytext; return UNIT; // Pascal
|
||||
"MPa" COUNT; yylval.quantity.scaler = Quantity::MegaPascal; yylval.quantity.unitStr = yytext; return UNIT; // Pascal
|
||||
"GPa" COUNT; yylval.quantity.scaler = Quantity::GigaPascal; yylval.quantity.unitStr = yytext; return UNIT; // Pascal
|
||||
|
||||
"Torr" COUNT; yylval.quantity.scaler = Quantity::Torr; yylval.quantity.unitStr = yytext; return UNIT; // portion of Pascal ( 101325/760 )
|
||||
"mTorr" COUNT; yylval.quantity.scaler = Quantity::mTorr; yylval.quantity.unitStr = yytext; return UNIT; //
|
||||
"uTorr" COUNT; yylval.quantity.scaler = Quantity::yTorr; yylval.quantity.unitStr = yytext; return UNIT; //
|
||||
"\xC2\xB5Torr" COUNT; yylval.quantity.scaler = Quantity::yTorr; yylval.quantity.unitStr = yytext; return UNIT; //
|
||||
|
||||
"psi" COUNT; yylval.quantity.scaler = Quantity::PSI; yylval.quantity.unitStr = yytext; return UNIT; // pounds/in^2
|
||||
"ksi" COUNT; yylval.quantity.scaler = Quantity::KSI; yylval.quantity.unitStr = yytext; return UNIT; // 1000 x pounds/in^2
|
||||
|
||||
"W" COUNT; yylval.quantity.scaler = Quantity::Watt; yylval.quantity.unitStr = yytext; return UNIT; // Watt (kg*m^2/s^3)
|
||||
"VA" COUNT; yylval.quantity.scaler = Quantity::VoltAmpere; yylval.quantity.unitStr = yytext; return UNIT; // VoltAmpere (kg*m^2/s^3)
|
||||
|
||||
"J" COUNT; yylval.quantity.scaler = Quantity::Joule; yylval.quantity.unitStr = yytext; return UNIT; // Joule (kg*m^2/s^2)
|
||||
"Nm" COUNT; yylval.quantity.scaler = Quantity::NewtonMeter; yylval.quantity.unitStr = yytext; return UNIT; // N*m = Joule
|
||||
"VAs" COUNT; yylval.quantity.scaler = Quantity::VoltAmpereSecond; yylval.quantity.unitStr = yytext; return UNIT; // V*A*s = Joule
|
||||
"CV" COUNT; yylval.quantity.scaler = Quantity::WattSecond; yylval.quantity.unitStr = yytext; return UNIT; //
|
||||
"Ws" COUNT; yylval.quantity.scaler = Quantity::WattSecond; yylval.quantity.unitStr = yytext; return UNIT; // W*s = Joule
|
||||
|
||||
"\xC2\xB0" COUNT; yylval.quantity.scaler = Quantity::Degree; yylval.quantity.unitStr = yytext; return UNIT; // degree (internal standard angle)
|
||||
"deg" COUNT; yylval.quantity.scaler = Quantity::Degree; yylval.quantity.unitStr = yytext; return UNIT; // degree (internal standard angle)
|
||||
"rad" COUNT; yylval.quantity.scaler = Quantity::Radian; yylval.quantity.unitStr = yytext; return UNIT; // radian
|
||||
"gon" COUNT; yylval.quantity.scaler = Quantity::Gon; yylval.quantity.unitStr = yytext; return UNIT; // gon
|
||||
|
||||
{DIGIT}*"."{DIGIT}+{EXPO}? COUNT; yylval.fvalue = num_change(yytext,'.',','); return yylval.fvalue == 1 ? ONE : NUM;
|
||||
{DIGIT}*","{DIGIT}+{EXPO}? COUNT; yylval.fvalue = num_change(yytext,',','.'); return yylval.fvalue == 1 ? ONE : NUM;
|
||||
{DIGIT}+ COUNT; yylval.ivalue = strtoll( yytext, NULL, 0 ); if (yylval.ivalue == 1) { yylval.fvalue = 1; return ONE; } else return INTEGER;
|
||||
|
||||
"pi" COUNT; yylval.constant.fvalue = M_PI; yylval.constant.name = "pi"; return CONSTANT; // constant pi
|
||||
"e" COUNT; yylval.constant.fvalue = M_E; yylval.constant.name = "e"; return CONSTANT; // constant e
|
||||
|
||||
$[A-Za-z]{1,2}+${DIGIT}+ COUNT; yylval.string = yytext; return CELLADDRESS;
|
||||
[A-Za-z]{1,2}${DIGIT}+ COUNT; yylval.string = yytext; return CELLADDRESS;
|
||||
$[A-Za-z]{1,2}{DIGIT}+ COUNT; yylval.string = yytext; return CELLADDRESS;
|
||||
|
||||
({L}{M}*)({L}{M}*|{N}|_)*[\20\t]*\( {
|
||||
COUNT;
|
||||
std::string s = yytext;
|
||||
size_t i = s.size() - 2;
|
||||
while (isspace(s[i]))
|
||||
--i;
|
||||
s.erase(i + 1);
|
||||
std::map<std::string, FunctionExpression::Function>::const_iterator j = registered_functions.find(s);
|
||||
if (j != registered_functions.end())
|
||||
yylval.func = j->second;
|
||||
else
|
||||
yylval.func = FunctionExpression::NONE;
|
||||
return FUNC;
|
||||
}
|
||||
|
||||
({L}{M}*)({L}{M}*|{N}|_)* COUNT; yylval.string = yytext; return IDENTIFIER;
|
2252
src/App/ExpressionParser.tab.c
Normal file
2252
src/App/ExpressionParser.tab.c
Normal file
File diff suppressed because it is too large
Load Diff
75
src/App/ExpressionParser.tab.h
Normal file
75
src/App/ExpressionParser.tab.h
Normal file
|
@ -0,0 +1,75 @@
|
|||
/* A Bison parser, made by GNU Bison 2.5. */
|
||||
|
||||
/* Bison interface for Yacc-like parsers in C
|
||||
|
||||
Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* As a special exception, you may create a larger work that contains
|
||||
part or all of the Bison parser skeleton and distribute that work
|
||||
under terms of your choice, so long as that work isn't itself a
|
||||
parser generator using the skeleton or a modified version thereof
|
||||
as a parser skeleton. Alternatively, if you modify or redistribute
|
||||
the parser skeleton itself, you may (at your option) remove this
|
||||
special exception, which will cause the skeleton and the resulting
|
||||
Bison output files to be licensed under the GNU General Public
|
||||
License without this special exception.
|
||||
|
||||
This special exception was added by the Free Software Foundation in
|
||||
version 2.2 of Bison. */
|
||||
|
||||
|
||||
/* Tokens. */
|
||||
#ifndef YYTOKENTYPE
|
||||
# define YYTOKENTYPE
|
||||
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||
know about them. */
|
||||
enum yytokentype {
|
||||
FUNC = 258,
|
||||
ONE = 259,
|
||||
NUM = 260,
|
||||
IDENTIFIER = 261,
|
||||
UNIT = 262,
|
||||
INTEGER = 263,
|
||||
CONSTANT = 264,
|
||||
CELLADDRESS = 265,
|
||||
EQ = 266,
|
||||
NEQ = 267,
|
||||
LT = 268,
|
||||
GT = 269,
|
||||
GTE = 270,
|
||||
LTE = 271,
|
||||
STRING = 272,
|
||||
MINUSSIGN = 273,
|
||||
PROPERTY_REF = 274,
|
||||
DOCUMENT = 275,
|
||||
OBJECT = 276,
|
||||
EXPONENT = 277,
|
||||
NEG = 278,
|
||||
POS = 279
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||
|
||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||
# define YYSTYPE_IS_DECLARED 1
|
||||
#endif
|
||||
|
||||
extern YYSTYPE yylval;
|
||||
|
||||
|
178
src/App/ExpressionParser.y
Normal file
178
src/App/ExpressionParser.y
Normal file
|
@ -0,0 +1,178 @@
|
|||
/* Parser for the FreeCAD Units language */
|
||||
/* (c) 2010 Juergen Riegel LGPL */
|
||||
/* (c) 2015 Eivind Kvedalen LGPL */
|
||||
|
||||
/* Represents the many different ways we can access our data */
|
||||
|
||||
%{
|
||||
|
||||
#define YYSTYPE semantic_type
|
||||
|
||||
std::stack<FunctionExpression::Function> functions; /**< Function identifier */
|
||||
|
||||
//#define YYSTYPE yystype
|
||||
#define yyparse ExpressionParser_yyparse
|
||||
#define yyerror ExpressionParser_yyerror
|
||||
%}
|
||||
|
||||
/* Bison declarations. */
|
||||
%token FUNC
|
||||
%token ONE
|
||||
%token NUM
|
||||
%token IDENTIFIER
|
||||
%token UNIT
|
||||
%token INTEGER
|
||||
%token CONSTANT
|
||||
%token CELLADDRESS
|
||||
%token EQ NEQ LT GT GTE LTE
|
||||
%token STRING MINUSSIGN PROPERTY_REF
|
||||
%token DOCUMENT OBJECT
|
||||
%token EXPONENT
|
||||
%type <arguments> args
|
||||
%type <expr> input exp unit_exp cond
|
||||
%type <quantity> UNIT
|
||||
%type <string> STRING IDENTIFIER CELLADDRESS
|
||||
%type <ivalue> INTEGER
|
||||
%type <string> PROPERTY_REF
|
||||
%type <fvalue> ONE
|
||||
%type <fvalue> NUM
|
||||
%type <constant> CONSTANT
|
||||
%type <expr> num
|
||||
%type <expr> basic_num
|
||||
%type <path> identifier
|
||||
%type <components> path subpath
|
||||
%type <func> FUNC
|
||||
%type <string_or_identifier> document
|
||||
%type <string_or_identifier> object
|
||||
%type <ivalue> integer
|
||||
%left ONE
|
||||
%left NUM
|
||||
%left INTEGER
|
||||
%left CONSTANT
|
||||
%left MINUSSIGN '+'
|
||||
%left '*' '/'
|
||||
%left '?' ':' EQ NEQ LT GT GTE LTE
|
||||
%left NEG /* negation--unary minus */
|
||||
%left POS /* unary plus */
|
||||
%right '^' /* exponentiation */
|
||||
%right EXPONENT
|
||||
|
||||
%destructor { delete $$; } exp cond unit_exp
|
||||
%destructor { std::vector<Expression*>::const_iterator i = $$.begin(); while (i != $$.end()) { delete *i; ++i; } } args
|
||||
|
||||
%start input
|
||||
|
||||
%%
|
||||
|
||||
input: exp { ScanResult = $1; valueExpression = true; }
|
||||
| unit_exp { ScanResult = $1; unitExpression = true; }
|
||||
;
|
||||
|
||||
exp: num { $$ = $1; }
|
||||
| STRING { $$ = new StringExpression(DocumentObject, $1); }
|
||||
| identifier { $$ = new VariableExpression(DocumentObject, $1); }
|
||||
| MINUSSIGN exp %prec NEG { $$ = new OperatorExpression(DocumentObject, $2, OperatorExpression::NEG, new NumberExpression(DocumentObject, -1)); }
|
||||
| '+' exp %prec POS { $$ = new OperatorExpression(DocumentObject, $2, OperatorExpression::POS, new NumberExpression(DocumentObject, 1)); }
|
||||
| exp '+' exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::ADD, $3); }
|
||||
| exp MINUSSIGN exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::SUB, $3); }
|
||||
| exp '*' exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::MUL, $3); }
|
||||
| exp '/' exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::DIV, $3); }
|
||||
| exp '/' unit_exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::DIV, $3); }
|
||||
| exp '^' exp %prec EXPONENT { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::POW, $3); }
|
||||
| '(' exp ')' { $$ = $2; }
|
||||
| FUNC args ')' { $$ = new FunctionExpression(DocumentObject, $1, $2); }
|
||||
| cond '?' exp ':' exp { $$ = new ConditionalExpression(DocumentObject, $1, $3, $5); }
|
||||
;
|
||||
|
||||
basic_num: ONE { $$ = new NumberExpression(DocumentObject, $1); }
|
||||
| NUM { $$ = new NumberExpression(DocumentObject, $1); }
|
||||
| INTEGER { $$ = new NumberExpression(DocumentObject, (double)$1); }
|
||||
;
|
||||
|
||||
num: basic_num { $$ = $1; }
|
||||
| CONSTANT { $$ = new ConstantExpression(DocumentObject, $1.name, $1.fvalue); }
|
||||
| basic_num unit_exp %prec EXPONENT { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::UNIT, $2); }
|
||||
| CONSTANT unit_exp { $$ = new OperatorExpression(DocumentObject, new ConstantExpression(DocumentObject, $1.name, $1.fvalue), OperatorExpression::UNIT, $2); }
|
||||
;
|
||||
|
||||
args: exp { $$.push_back($1); }
|
||||
| args ',' exp { $1.push_back($3); $$ = $1; }
|
||||
| args ';' exp { $1.push_back($3); $$ = $1; }
|
||||
;
|
||||
|
||||
cond: exp EQ exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::EQ, $3); }
|
||||
| exp NEQ exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::NEQ, $3); }
|
||||
| exp LT exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::LT, $3); }
|
||||
| exp GT exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::GT, $3); }
|
||||
| exp GTE exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::GTE, $3); }
|
||||
| exp LTE exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::LTE, $3); }
|
||||
;
|
||||
|
||||
unit_exp: UNIT { $$ = new UnitExpression(DocumentObject, $1.scaler, $1.unitStr ); }
|
||||
| ONE '/' unit_exp { $$ = new OperatorExpression(DocumentObject, new NumberExpression(DocumentObject, $1), OperatorExpression::DIV, $3); }
|
||||
| unit_exp '/' unit_exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::DIV, $3); }
|
||||
| unit_exp '*' unit_exp { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::MUL, $3); }
|
||||
| unit_exp '^' basic_num %prec EXPONENT { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::POW, $3); }
|
||||
| unit_exp '^' MINUSSIGN basic_num %prec EXPONENT { $$ = new OperatorExpression(DocumentObject, $1, OperatorExpression::POW, new OperatorExpression(DocumentObject, $4, OperatorExpression::NEG, new NumberExpression(DocumentObject, -1))); }
|
||||
| '(' unit_exp ')' { $$ = $2; }
|
||||
;
|
||||
|
||||
identifier: path { /* Path to property within document object */
|
||||
$$ = ObjectIdentifier(DocumentObject);
|
||||
$$.addComponents($1);
|
||||
}
|
||||
| object '.' path { /* Path to property within document object */
|
||||
$$ = ObjectIdentifier(DocumentObject);
|
||||
$$.setDocumentObjectName($1, true);
|
||||
$$.addComponents($3);
|
||||
}
|
||||
| document '#' path { /* Path to property from an external document, within a named document object */
|
||||
$$ = ObjectIdentifier(DocumentObject);
|
||||
$$.setDocumentName($1, true);
|
||||
$$.addComponents($3);
|
||||
}
|
||||
| document '#' object '.' path { /* Path to property from an external document, within a named document object */
|
||||
$$ = ObjectIdentifier(DocumentObject);
|
||||
$$.setDocumentName($1, true);
|
||||
$$.setDocumentObjectName($3, true);
|
||||
$$.addComponents($5);
|
||||
}
|
||||
;
|
||||
|
||||
integer: INTEGER { $$ = $1; }
|
||||
| ONE { $$ = $1; }
|
||||
;
|
||||
|
||||
|
||||
path: IDENTIFIER { $$.push_front(ObjectIdentifier::Component::SimpleComponent($1)); }
|
||||
| CELLADDRESS { $$.push_front(ObjectIdentifier::Component::SimpleComponent($1)); }
|
||||
| IDENTIFIER '[' integer ']' { $$.push_front(ObjectIdentifier::Component::ArrayComponent($1, $3)); }
|
||||
| IDENTIFIER '[' integer ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::ArrayComponent($1, $3)); $$ = $6; }
|
||||
| IDENTIFIER '[' STRING ']' { $$.push_front(ObjectIdentifier::Component::MapComponent($1, ObjectIdentifier::String($3, true))); }
|
||||
| IDENTIFIER '[' IDENTIFIER ']' { $$.push_front(ObjectIdentifier::Component::MapComponent($1, $3)); }
|
||||
| IDENTIFIER '[' STRING ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::MapComponent($1, ObjectIdentifier::String($3, true))); $$ = $6; }
|
||||
| IDENTIFIER '[' IDENTIFIER ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::MapComponent($1, $3)); $$ = $6; }
|
||||
| IDENTIFIER '.' subpath { $3.push_front(ObjectIdentifier::Component::SimpleComponent($1)); $$ = $3; }
|
||||
;
|
||||
|
||||
subpath: IDENTIFIER { $$.push_front(ObjectIdentifier::Component::SimpleComponent($1)); }
|
||||
| STRING { $$.push_front(ObjectIdentifier::Component::SimpleComponent($1)); }
|
||||
| CELLADDRESS { $$.push_front(ObjectIdentifier::Component::SimpleComponent($1)); }
|
||||
| IDENTIFIER '[' integer ']' { $$.push_front(ObjectIdentifier::Component::ArrayComponent($1, $3)); }
|
||||
| IDENTIFIER '[' integer ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::ArrayComponent($1, $3)); $$ = $6; }
|
||||
| IDENTIFIER '[' STRING ']' { $$.push_front(ObjectIdentifier::Component::MapComponent($1, ObjectIdentifier::String($3, true))); }
|
||||
| IDENTIFIER '[' IDENTIFIER ']' { $$.push_front(ObjectIdentifier::Component::MapComponent($1, $3)); }
|
||||
| IDENTIFIER '[' STRING ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::MapComponent($1, ObjectIdentifier::String($3, true))); $$ = $6; }
|
||||
| IDENTIFIER '[' IDENTIFIER ']' '.' subpath { $6.push_front(ObjectIdentifier::Component::MapComponent($1, $3)); $$ = $6; }
|
||||
| IDENTIFIER '.' subpath { $3.push_front(ObjectIdentifier::Component::SimpleComponent($1)); $$ = $3; }
|
||||
;
|
||||
|
||||
document: STRING { $$ = ObjectIdentifier::String($1, true); }
|
||||
| IDENTIFIER { $$ = ObjectIdentifier::String($1); }
|
||||
;
|
||||
|
||||
object: STRING { $$ = ObjectIdentifier::String($1, true); }
|
||||
| CELLADDRESS { $$ = ObjectIdentifier::String($1, true); }
|
||||
;
|
||||
|
||||
%%
|
940
src/App/ObjectIdentifier.cpp
Normal file
940
src/App/ObjectIdentifier.cpp
Normal file
|
@ -0,0 +1,940 @@
|
|||
/***************************************************************************
|
||||
* Copyright (c) Eivind Kvedalen (eivind@kvedalen.name) 2015 *
|
||||
* *
|
||||
* This file is part of the FreeCAD CAx development system. *
|
||||
* *
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU Library General Public *
|
||||
* License as published by the Free Software Foundation; either *
|
||||
* version 2 of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This library is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Library General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Library General Public *
|
||||
* License along with this library; see the file COPYING.LIB. If not, *
|
||||
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
||||
* Suite 330, Boston, MA 02111-1307, USA *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include "PreCompiled.h"
|
||||
|
||||
#ifndef _PreComp_
|
||||
# include <cassert>
|
||||
#endif
|
||||
|
||||
/// Here the FreeCAD includes sorted by Base,App,Gui......
|
||||
#include "Property.h"
|
||||
#include "Application.h"
|
||||
#include "Document.h"
|
||||
#include "DocumentObject.h"
|
||||
#include "ObjectIdentifier.h"
|
||||
#include "Expression.h"
|
||||
#include <Base/Tools.h>
|
||||
#include <Base/Interpreter.h>
|
||||
#include <Base/QuantityPy.h>
|
||||
|
||||
using namespace App;
|
||||
using namespace Base;
|
||||
|
||||
/**
|
||||
* @brief Compute a hash value for the object identifier given by \a path.
|
||||
* @param path Inputn path
|
||||
* @return Hash value
|
||||
*/
|
||||
|
||||
std::size_t App::hash_value(const App::ObjectIdentifier & path)
|
||||
{
|
||||
return boost::hash_value(path.toString());
|
||||
}
|
||||
|
||||
// Path class
|
||||
|
||||
/**
|
||||
* @brief Quote input string according to quoting rules for an expression: because " and ' are
|
||||
* used to designate inch and foot units, strings are quoted as <<string>>.
|
||||
*
|
||||
* @param input
|
||||
* @return
|
||||
*/
|
||||
|
||||
std::string App::quote(const std::string &input)
|
||||
{
|
||||
std::stringstream output;
|
||||
|
||||
std::string::const_iterator cur = input.begin();
|
||||
std::string::const_iterator end = input.end();
|
||||
|
||||
output << "<<";
|
||||
while (cur != end) {
|
||||
switch (*cur) {
|
||||
case '\t':
|
||||
output << "\\t";
|
||||
break;
|
||||
case '\n':
|
||||
output << "\\n";
|
||||
break;
|
||||
case '\r':
|
||||
output << "\\r";
|
||||
break;
|
||||
case '\\':
|
||||
output << "\\\\";
|
||||
break;
|
||||
case '\'':
|
||||
output << "\\'";
|
||||
break;
|
||||
case '"':
|
||||
output << "\\\"";
|
||||
break;
|
||||
case '>':
|
||||
output << "\\>";
|
||||
break;
|
||||
default:
|
||||
output << *cur;
|
||||
}
|
||||
++cur;
|
||||
}
|
||||
output << ">>";
|
||||
|
||||
return output.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct an ObjectIdentifier object, given an owner and a single-value property.
|
||||
* @param _owner Owner of property.
|
||||
* @param property Name of property.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::ObjectIdentifier(const App::PropertyContainer * _owner, const std::string & property)
|
||||
: owner(_owner)
|
||||
, documentNameSet(false)
|
||||
, documentObjectNameSet(false)
|
||||
, propertyIndex(-1)
|
||||
{
|
||||
if (property.size() > 0)
|
||||
addComponent(Component::SimpleComponent(property));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct an ObjectIdentifier object given a property. The property is assumed to be single-valued.
|
||||
* @param prop Property to construct object idenfier for.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::ObjectIdentifier(const Property &prop)
|
||||
: owner(prop.getContainer())
|
||||
, documentNameSet(false)
|
||||
, documentObjectNameSet(false)
|
||||
, propertyIndex(-1)
|
||||
{
|
||||
addComponent(Component::SimpleComponent(String(owner->getPropertyName(&prop))));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the name of the property.
|
||||
* @return Name
|
||||
*/
|
||||
|
||||
const std::string App::ObjectIdentifier::getPropertyName() const
|
||||
{
|
||||
resolve();
|
||||
|
||||
assert(propertyIndex >=0 && static_cast<std::size_t>(propertyIndex) < components.size());
|
||||
|
||||
return components[propertyIndex].toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get Component at given index \a i.
|
||||
* @param i Index to get
|
||||
* @return A component.
|
||||
*/
|
||||
|
||||
const App::ObjectIdentifier::Component &App::ObjectIdentifier::getPropertyComponent(int i) const
|
||||
{
|
||||
resolve();
|
||||
|
||||
assert(propertyIndex + i >=0 && static_cast<std::size_t>(propertyIndex) + i < components.size());
|
||||
|
||||
return components[propertyIndex + i];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compare object identifier with \a other.
|
||||
* @param other Other object identifier.
|
||||
* @return true if they are equal.
|
||||
*/
|
||||
|
||||
bool ObjectIdentifier::operator ==(const ObjectIdentifier &other) const
|
||||
{
|
||||
resolve();
|
||||
other.resolve();
|
||||
|
||||
if (owner != other.owner)
|
||||
return false;
|
||||
if (documentName != other.documentName)
|
||||
return false;
|
||||
if (documentObjectName != other.documentObjectName)
|
||||
return false;
|
||||
if (components != other.components)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compare object identifier with \a other.
|
||||
* @param other Other object identifier
|
||||
* @return true if they differ from each other.
|
||||
*/
|
||||
|
||||
bool ObjectIdentifier::operator !=(const ObjectIdentifier &other) const
|
||||
{
|
||||
return !(operator==)(other);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compare object identifier with other.
|
||||
* @param other Other object identifier.
|
||||
* @return true if this object is less than the other.
|
||||
*/
|
||||
|
||||
bool ObjectIdentifier::operator <(const ObjectIdentifier &other) const
|
||||
{
|
||||
resolve();
|
||||
other.resolve();
|
||||
|
||||
if (documentName < other.documentName)
|
||||
return true;
|
||||
|
||||
if (documentName > other.documentName)
|
||||
return false;
|
||||
|
||||
if (documentObjectName < other.documentObjectName)
|
||||
return true;
|
||||
|
||||
if (documentObjectName > other.documentObjectName)
|
||||
return false;
|
||||
|
||||
if (components.size() < other.components.size())
|
||||
return true;
|
||||
|
||||
if (components.size() > other.components.size())
|
||||
return false;
|
||||
|
||||
for (std::size_t i = 0; i < components.size(); ++i) {
|
||||
if (components[i].name < other.components[i].name)
|
||||
return true;
|
||||
if (components[i].name > other.components[i].name)
|
||||
return false;
|
||||
if (components[i].type < other.components[i].type)
|
||||
return true;
|
||||
if (components[i].type > other.components[i].type)
|
||||
return false;
|
||||
if (components[i].isArray()) {
|
||||
if (components[i].index < other.components[i].index)
|
||||
return true;
|
||||
if (components[i].index > other.components[i].index)
|
||||
return false;
|
||||
}
|
||||
else if (components[i].isMap()) {
|
||||
if (components[i].key < other.components[i].key)
|
||||
return true;
|
||||
if (components[i].key > other.components[i].key)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return number of components.
|
||||
* @return Number of components in this identifier.
|
||||
*/
|
||||
|
||||
int ObjectIdentifier::numComponents() const
|
||||
{
|
||||
return components.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Compute number of sub components, i.e excluding the property.
|
||||
* @return Number of components.
|
||||
*/
|
||||
|
||||
int ObjectIdentifier::numSubComponents() const
|
||||
{
|
||||
return components.size() - propertyIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a string representation of this object identifier.
|
||||
*
|
||||
* An identifier is written as document#documentobject.property.subproperty1...subpropertyN
|
||||
* document# may be dropped; it is assumed to be within owner's document. If documentobject is dropped,
|
||||
* the property is assumed to be owned by the owner specified in the object identifiers constructor.
|
||||
*
|
||||
* @return A string
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::toString() const
|
||||
{
|
||||
std::stringstream s;
|
||||
|
||||
resolve();
|
||||
|
||||
if (documentNameSet)
|
||||
s << getDocumentName().toString() << "#";
|
||||
|
||||
if (documentObjectNameSet)
|
||||
s << getDocumentObjectName().toString() << ".";
|
||||
else if (propertyIndex > 0)
|
||||
s << components[0].toString() << ".";
|
||||
|
||||
s << getPropertyName() << getSubPathStr();
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Escape toString representation so it is suitable for being embeddded in a python command.
|
||||
* @return Escaped string.
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::toEscapedString() const
|
||||
{
|
||||
return Base::Tools::escapedUnicodeFromUtf8(toString().c_str());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Modifiy object identifier given that document object \a oldName gets the new name \a newName.
|
||||
* @param oldName Name of current document object
|
||||
* @param newName New name of document object
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::renameDocumentObject(const std::string &oldName, const std::string &newName)
|
||||
{
|
||||
if (documentObjectNameSet && documentObjectName == oldName) {
|
||||
if (ExpressionParser::isTokenAnIndentifier(newName))
|
||||
documentObjectName = newName;
|
||||
else
|
||||
documentObjectName = ObjectIdentifier::String(newName, true);
|
||||
}
|
||||
else if (propertyIndex == 1 && documentObjectName == oldName) {
|
||||
if (ExpressionParser::isTokenAnIndentifier(newName))
|
||||
components[0].name = newName;
|
||||
else
|
||||
components[0].name = ObjectIdentifier::String(newName, true);
|
||||
}
|
||||
resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Modify object identifier given that the document \a oldName has changed name to \a newName.
|
||||
* @param oldName Name of current document
|
||||
* @param newName New name of document
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::renameDocument(const std::string &oldName, const std::string &newName)
|
||||
{
|
||||
if (documentName == oldName) {
|
||||
documentName = newName;
|
||||
}
|
||||
|
||||
resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get sub field part of a property as a string.
|
||||
* @return String representation of path.
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::getSubPathStr() const
|
||||
{
|
||||
resolve();
|
||||
|
||||
std::stringstream s;
|
||||
std::vector<Component>::const_iterator i = components.begin() + propertyIndex + 1;
|
||||
while (i != components.end()) {
|
||||
s << "." << i->toString();
|
||||
++i;
|
||||
}
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a Component part
|
||||
* @param _component Name of component
|
||||
* @param _type Type; simple, array, or map
|
||||
* @param _index Array index, if type is array, or -1 if simple or map.
|
||||
* @param _key Key index, if type is map, ir empty if simple or array.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::Component::Component(const String &_component, ObjectIdentifier::Component::typeEnum _type, int _index, String _key)
|
||||
: name(_component)
|
||||
, type(_type)
|
||||
, index(_index)
|
||||
, key(_key)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a simple component part with the given name
|
||||
* @param _component Name of component.
|
||||
* @return A new Component object.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::Component ObjectIdentifier::Component::SimpleComponent(const char *_component)
|
||||
{
|
||||
return Component(String(_component));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a simple component part with the given name
|
||||
* @param _component Name of component.
|
||||
* @return A new Component object.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::Component ObjectIdentifier::Component::SimpleComponent(const ObjectIdentifier::String &_component)
|
||||
{
|
||||
return Component(_component);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create an array component with given name and index.
|
||||
* @param _component Name of component
|
||||
* @param _index Index of component
|
||||
* @return A new Component object.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::Component ObjectIdentifier::Component::ArrayComponent(const ObjectIdentifier::String &_component, int _index)
|
||||
{
|
||||
return Component(_component, ARRAY, _index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a map component with given name and key.
|
||||
* @param _component Name of component
|
||||
* @param _key Key of component
|
||||
* @return A new Component object.
|
||||
*/
|
||||
|
||||
ObjectIdentifier::Component ObjectIdentifier::Component::MapComponent(const ObjectIdentifier::String &_component, const String & _key)
|
||||
{
|
||||
return Component(_component, MAP, -1, _key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Comparison operator for Component objects.
|
||||
* @param other The object we want to compare to.
|
||||
* @return true if they are equal, false if not.
|
||||
*/
|
||||
|
||||
bool ObjectIdentifier::Component::operator ==(const ObjectIdentifier::Component &other) const
|
||||
{
|
||||
if (type != other.type)
|
||||
return false;
|
||||
|
||||
if (name != other.name)
|
||||
return false;
|
||||
|
||||
switch (type) {
|
||||
case SIMPLE:
|
||||
return true;
|
||||
case ARRAY:
|
||||
return index == other.index;
|
||||
case MAP:
|
||||
return key == other.key;
|
||||
default:
|
||||
assert(0);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a string representation of a component.
|
||||
* @return A string representing the component.
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::Component::toString() const
|
||||
{
|
||||
std::stringstream s;
|
||||
|
||||
s << name.toString();
|
||||
switch (type) {
|
||||
case Component::SIMPLE:
|
||||
break;
|
||||
case Component::MAP:
|
||||
s << "[" << key.toString() << "]";
|
||||
break;
|
||||
case Component::ARRAY:
|
||||
s << "[" << index << "]";
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Search for the document object given by name in doc.
|
||||
*
|
||||
* Name might be the internal name or a label. In any case, it must uniquely define
|
||||
* the document object.
|
||||
*
|
||||
* @param doc Document to search
|
||||
* @param name Name to search for.
|
||||
* @return Pointer to document object if a unique pointer is found, 0 otherwise.
|
||||
*/
|
||||
|
||||
App::DocumentObject * ObjectIdentifier::getDocumentObject(const App::Document * doc, const std::string & name) const
|
||||
{
|
||||
DocumentObject * o1 = 0;
|
||||
DocumentObject * o2 = 0;
|
||||
std::vector<DocumentObject*> docObjects = doc->getObjects();
|
||||
|
||||
for (std::vector<DocumentObject*>::iterator j = docObjects.begin(); j != docObjects.end(); ++j) {
|
||||
if (strcmp((*j)->Label.getValue(), name.c_str()) == 0) {
|
||||
// Found object with matching label
|
||||
if (o1 != 0)
|
||||
return 0;
|
||||
o1 = *j;
|
||||
}
|
||||
}
|
||||
|
||||
// No object found with matching label, try using name directly
|
||||
o2 = doc->getObject(name.c_str());
|
||||
|
||||
if (o1 == 0 && o2 == 0) // Not found at all
|
||||
return 0;
|
||||
else if (o1 == 0) // Found by name
|
||||
return o2;
|
||||
else if (o2 == 0) // Found by label
|
||||
return o1;
|
||||
else if (o1 == o2) // Found by both name and label, same object
|
||||
return o1;
|
||||
else
|
||||
return 0; // Found by both name and label, two different objects
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Resolve the object identifier to a concrete document, documentobject, and property.
|
||||
*
|
||||
* This method is a helper methos that updates mutable data in the object, to be used by
|
||||
* other public methods of this class.
|
||||
*
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::resolve() const
|
||||
{
|
||||
const App::Document * doc;
|
||||
const App::DocumentObject * docObject;
|
||||
|
||||
if (freecad_dynamic_cast<DocumentObject>(owner) == 0)
|
||||
return;
|
||||
|
||||
/* Document name specified? */
|
||||
if (documentName.getString().size() > 0) {
|
||||
doc = getDocument(documentName);
|
||||
}
|
||||
else
|
||||
doc = freecad_dynamic_cast<DocumentObject>(owner)->getDocument();
|
||||
|
||||
propertyName = "";
|
||||
propertyIndex = 0;
|
||||
|
||||
// Assume document name and object name from owner if not found
|
||||
if (doc == 0) {
|
||||
doc = freecad_dynamic_cast<DocumentObject>(owner)->getDocument();
|
||||
if (doc == 0) {
|
||||
documentName = String();
|
||||
documentObjectName = String();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
documentName = String(doc->Label.getValue());
|
||||
|
||||
/* Document object name specified? */
|
||||
if (documentObjectNameSet) {
|
||||
docObject = getDocumentObject(doc, documentObjectName.getString());
|
||||
if (!docObject)
|
||||
return;
|
||||
if (components.size() > 0) {
|
||||
propertyName = components[0].name.getString();
|
||||
propertyIndex = 0;
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
else {
|
||||
/* Document object name not specified, resolve from path */
|
||||
if (components.size() == 1) {
|
||||
documentObjectName = String(freecad_dynamic_cast<DocumentObject>(owner)->getNameInDocument());
|
||||
propertyName = components[0].name.getString();
|
||||
propertyIndex = 0;
|
||||
}
|
||||
else if (components.size() >= 2) {
|
||||
if (!components[0].isSimple())
|
||||
return;
|
||||
|
||||
docObject = getDocumentObject(doc, components[0].name);
|
||||
|
||||
if (docObject) {
|
||||
documentObjectName = components[0].name;
|
||||
propertyName = components[1].name.getString();
|
||||
propertyIndex = 1;
|
||||
}
|
||||
else {
|
||||
documentObjectName = String(freecad_dynamic_cast<DocumentObject>(owner)->getNameInDocument());
|
||||
propertyName = components[0].name.getString();
|
||||
propertyIndex = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Find a document with the given name.
|
||||
* @param name Name of document
|
||||
* @return Pointer to document, or 0 if it is not found or not uniquely defined by name.
|
||||
*/
|
||||
|
||||
Document * ObjectIdentifier::getDocument(String name) const
|
||||
{
|
||||
App::Document * doc = 0;
|
||||
const std::vector<App::Document*> docs = App::GetApplication().getDocuments();
|
||||
|
||||
if (name.getString().size() == 0)
|
||||
name = getDocumentName();
|
||||
|
||||
for (std::vector<App::Document*>::const_iterator i = docs.begin(); i != docs.end(); ++i) {
|
||||
if ((*i)->Label.getValue() == name.getString()) {
|
||||
if (doc != 0)
|
||||
return 0;
|
||||
doc = *i;
|
||||
}
|
||||
}
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the document object for the object identifier.
|
||||
* @return Pointer to document object, or 0 if not found or uniquely defined.
|
||||
*/
|
||||
|
||||
DocumentObject *ObjectIdentifier::getDocumentObject() const
|
||||
{
|
||||
const App::Document * doc = getDocument();
|
||||
|
||||
if (!doc)
|
||||
return 0;
|
||||
|
||||
return getDocumentObject(doc, documentObjectName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get components as a string list.
|
||||
* @return List of strings.
|
||||
*/
|
||||
|
||||
std::vector<std::string> ObjectIdentifier::getStringList() const
|
||||
{
|
||||
std::vector<std::string> l;
|
||||
|
||||
if (documentNameSet)
|
||||
l.push_back(documentName.toString());
|
||||
if (documentObjectNameSet)
|
||||
l.push_back(documentObjectName.toString());
|
||||
|
||||
std::vector<Component>::const_iterator i = components.begin();
|
||||
while (i != components.end()) {
|
||||
l.push_back(i->toString());
|
||||
++i;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct the simplest possible object identifier relative to another.
|
||||
* @param other The other object identifier.
|
||||
* @return A new simplified object identifier.
|
||||
*/
|
||||
|
||||
ObjectIdentifier ObjectIdentifier::relativeTo(const ObjectIdentifier &other) const
|
||||
{
|
||||
ObjectIdentifier result(owner);
|
||||
|
||||
if (other.getDocument() != getDocument())
|
||||
result.setDocumentName(getDocumentName(), true);
|
||||
if (other.getDocumentObject() != getDocumentObject())
|
||||
result.setDocumentObjectName(getDocumentObjectName(), true);
|
||||
|
||||
for (std::size_t i = propertyIndex; i < components.size(); ++i)
|
||||
result << components[i];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Parse a string to create an object identifier.
|
||||
*
|
||||
* This method throws an exception if the string is invalid.
|
||||
*
|
||||
* @param docObj Document object that will own this object identifier.
|
||||
* @param str String to parse
|
||||
* @return A new object identifier.
|
||||
*/
|
||||
|
||||
ObjectIdentifier ObjectIdentifier::parse(const DocumentObject *docObj, const std::string &str)
|
||||
{
|
||||
std::auto_ptr<Expression> expr(ExpressionParser::parse(docObj, str.c_str()));
|
||||
VariableExpression * v = freecad_dynamic_cast<VariableExpression>(expr.get());
|
||||
|
||||
if (v)
|
||||
return v->getPath();
|
||||
else
|
||||
throw Base::Exception("Invalid property specification.");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief << operator, used to add a component to the object identifier.
|
||||
* @param value Component object
|
||||
* @return Reference to itself.
|
||||
*/
|
||||
|
||||
ObjectIdentifier &ObjectIdentifier::operator <<(const ObjectIdentifier::Component &value)
|
||||
{
|
||||
components.push_back(value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get pointer to property pointed to by this object identifier.
|
||||
* @return Point to property if it is uniquely defined, or 0 otherwise.
|
||||
*/
|
||||
|
||||
Property *ObjectIdentifier::getProperty() const
|
||||
{
|
||||
const App::Document * doc = getDocument();
|
||||
|
||||
if (!doc)
|
||||
return 0;
|
||||
|
||||
App::DocumentObject * docObj = getDocumentObject(doc, documentObjectName);
|
||||
|
||||
if (!docObj)
|
||||
return 0;
|
||||
|
||||
return docObj->getPropertyByName(getPropertyComponent(0).getName().c_str());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a canonical representation of an object identifier.
|
||||
*
|
||||
* The main work is actually done by the property's virtual canonicalPath(...) method,
|
||||
* which is invoked by this call.
|
||||
*
|
||||
* @return A new object identifier.
|
||||
*/
|
||||
|
||||
ObjectIdentifier ObjectIdentifier::canonicalPath() const
|
||||
{
|
||||
// Simplify input path by ensuring that components array only has property + optional sub-properties first.
|
||||
ObjectIdentifier simplified(getDocumentObject());
|
||||
|
||||
for (std::size_t i = propertyIndex; i < components.size(); ++i)
|
||||
simplified << components[i];
|
||||
|
||||
Property * prop = getProperty();
|
||||
|
||||
// Invoke properties canonicalPath method, to let the property do the rest of the job.
|
||||
|
||||
return prop ? prop->canonicalPath(simplified) : simplified;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the document name for this object identifier.
|
||||
*
|
||||
* If force is true, the document name will always be included in the string representation.
|
||||
*
|
||||
* @param name Name of document object.
|
||||
* @param force Force name to be set
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::setDocumentName(const ObjectIdentifier::String &name, bool force)
|
||||
{
|
||||
documentName = name;
|
||||
documentNameSet = force;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the document name from this object identifier
|
||||
*
|
||||
* @return Document name as a String object.
|
||||
*/
|
||||
|
||||
const ObjectIdentifier::String ObjectIdentifier::getDocumentName() const
|
||||
{
|
||||
resolve();
|
||||
return documentName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the document object name of this object identifier.
|
||||
*
|
||||
* If force is true, the document object will not be resolved dynamically from the
|
||||
* object identifier's components, but used as given by this method.
|
||||
*
|
||||
* @param name Name of document object.
|
||||
* @param force Force name to be set.
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::setDocumentObjectName(const ObjectIdentifier::String &name, bool force)
|
||||
{
|
||||
documentObjectName = name;
|
||||
documentObjectNameSet = force;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the document object name
|
||||
* @return String with name of document object as resolved by object identifier.
|
||||
*/
|
||||
|
||||
const ObjectIdentifier::String ObjectIdentifier::getDocumentObjectName() const
|
||||
{
|
||||
resolve();
|
||||
return documentObjectName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get a string representation of this object identifier.
|
||||
* @return String representation.
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::String::toString() const
|
||||
{
|
||||
if (isRealString())
|
||||
return quote(str);
|
||||
else
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return a string that can be used to access the property or field pointed to by
|
||||
* this object identifier.
|
||||
* @return Python code as a string
|
||||
*/
|
||||
|
||||
std::string ObjectIdentifier::getPythonAccessor() const
|
||||
{
|
||||
std::stringstream s;
|
||||
DocumentObject * docObj = getDocumentObject();
|
||||
|
||||
s << "App.getDocument('" << getDocumentName() << "')."
|
||||
<< "getObject('" << docObj->getNameInDocument() << "')."
|
||||
<< getPropertyName() << getSubPathStr();
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the value of the property or field pointed to by this object identifier.
|
||||
*
|
||||
* Only a limited number of types are supported: Int, Float, String, Unicode String, and Quantities.
|
||||
*
|
||||
* @return The value of the property or field.
|
||||
*/
|
||||
|
||||
boost::any ObjectIdentifier::getValue() const
|
||||
{
|
||||
std::string s = "_path_value_temp_ = " + getPythonAccessor();
|
||||
PyObject * pyvalue = Base::Interpreter().getValue(s.c_str(), "_path_value_temp_");
|
||||
|
||||
class destructor {
|
||||
public:
|
||||
destructor(PyObject * _p) : p(_p) { }
|
||||
~destructor() { Py_DECREF(p); }
|
||||
private:
|
||||
PyObject * p;
|
||||
};
|
||||
|
||||
destructor d1(pyvalue);
|
||||
|
||||
if (!pyvalue)
|
||||
throw Base::Exception("Failed to get property value.");
|
||||
|
||||
if (PyInt_Check(pyvalue))
|
||||
return boost::any(PyInt_AsLong(pyvalue));
|
||||
else if (PyFloat_Check(pyvalue))
|
||||
return boost::any(PyFloat_AsDouble(pyvalue));
|
||||
else if (PyString_Check(pyvalue))
|
||||
return boost::any(PyString_AsString(pyvalue));
|
||||
else if (PyUnicode_Check(pyvalue)) {
|
||||
PyObject * s = PyUnicode_AsUTF8String(pyvalue);
|
||||
destructor d2(s);
|
||||
|
||||
return boost::any(PyString_AsString(s));
|
||||
}
|
||||
else if (PyObject_TypeCheck(pyvalue, &Base::QuantityPy::Type)) {
|
||||
Base::QuantityPy * qp = static_cast<Base::QuantityPy*>(pyvalue);
|
||||
Base::Quantity * q = qp->getQuantityPtr();
|
||||
|
||||
return boost::any(*q);
|
||||
}
|
||||
else {
|
||||
throw Base::Exception("Invalid property type.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set value of a property or field pointed to by this object identifier.
|
||||
*
|
||||
* This method uses Python to do the actual work. and a limited set of types that
|
||||
* can be in the boost::any variable is supported: Base::Quantity, double,
|
||||
* char*, const char*, int, unsigned int, short, unsigned short, char, and unsigned char.
|
||||
*
|
||||
* @param value Value to set
|
||||
*/
|
||||
|
||||
void ObjectIdentifier::setValue(const boost::any &value) const
|
||||
{
|
||||
std::stringstream ss;
|
||||
|
||||
ss << getPythonAccessor() + " = ";
|
||||
|
||||
if (value.type() == typeid(Base::Quantity))
|
||||
ss << boost::any_cast<Base::Quantity>(value).getValue();
|
||||
else if (value.type() == typeid(double))
|
||||
ss << boost::any_cast<double>(value);
|
||||
else if (value.type() == typeid(char*))
|
||||
ss << '\'' << Base::Tools::escapedUnicodeFromUtf8(boost::any_cast<char*>(value)) << '\'';
|
||||
else if (value.type() == typeid(const char*))
|
||||
ss << '\'' << Base::Tools::escapedUnicodeFromUtf8(boost::any_cast<const char*>(value)) << '\'';
|
||||
else if (value.type() == typeid(std::string))
|
||||
ss << '\'' << Base::Tools::escapedUnicodeFromUtf8(boost::any_cast<std::string>(value).c_str()) << '\'';
|
||||
else if (value.type() == typeid(int))
|
||||
ss << boost::any_cast<int>(value);
|
||||
else if (value.type() == typeid(unsigned int))
|
||||
ss << boost::any_cast<unsigned int >(value);
|
||||
else if (value.type() == typeid(short))
|
||||
ss << boost::any_cast<short>(value);
|
||||
else if (value.type() == typeid(unsigned short))
|
||||
ss << boost::any_cast<unsigned short>(value);
|
||||
else if (value.type() == typeid(char))
|
||||
ss << boost::any_cast<char>(value);
|
||||
else if (value.type() == typeid(unsigned char))
|
||||
ss << boost::any_cast<unsigned char>(value);
|
||||
else
|
||||
throw std::bad_cast();
|
||||
|
||||
Base::Interpreter().runString(ss.str().c_str());
|
||||
}
|
249
src/App/ObjectIdentifier.h
Normal file
249
src/App/ObjectIdentifier.h
Normal file
|
@ -0,0 +1,249 @@
|
|||
/***************************************************************************
|
||||
* Copyright (c) Eivind Kvedalen <eivind@kvedalen.name> 2015 *
|
||||
* *
|
||||
* This file is part of the FreeCAD CAx development system. *
|
||||
* *
|
||||
* This library is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU Library General Public *
|
||||
* License as published by the Free Software Foundation; either *
|
||||
* version 2 of the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This library is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU Library General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Library General Public *
|
||||
* License along with this library; see the file COPYING.LIB. If not, *
|
||||
* write to the Free Software Foundation, Inc., 59 Temple Place, *
|
||||
* Suite 330, Boston, MA 02111-1307, USA *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#ifndef APP_PATH_H
|
||||
#define APP_PATH_H
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <boost/any.hpp>
|
||||
|
||||
namespace App
|
||||
{
|
||||
|
||||
class Property;
|
||||
class Document;
|
||||
class PropertyContainer;
|
||||
class DocumentObject;
|
||||
|
||||
AppExport std::string quote(const std::string &input);
|
||||
|
||||
class AppExport ObjectIdentifier {
|
||||
|
||||
public:
|
||||
|
||||
class String {
|
||||
|
||||
public:
|
||||
|
||||
// Constructor
|
||||
String(const std::string & s = "", bool _isRealString = false) : str(s), isString(_isRealString) { }
|
||||
|
||||
// Accessors
|
||||
|
||||
/** Returns the string */
|
||||
std::string getString() const { return str; }
|
||||
|
||||
/** Return true is string need to be quoted */
|
||||
bool isRealString() const { return isString; }
|
||||
|
||||
/** Returns a possibly quoted string */
|
||||
std::string toString() const;
|
||||
|
||||
// Operators
|
||||
|
||||
operator std::string() const { return str; }
|
||||
|
||||
operator const char *() const { return str.c_str(); }
|
||||
|
||||
bool operator==(const String & other) const { return str == other.str; }
|
||||
|
||||
bool operator!=(const String & other) const { return str != other.str; }
|
||||
|
||||
bool operator>=(const String & other) const { return str >= other.str; }
|
||||
|
||||
bool operator<(const String & other) const { return str < other.str; }
|
||||
|
||||
bool operator>(const String & other) const { return str > other.str; }
|
||||
|
||||
private:
|
||||
|
||||
std::string str;
|
||||
bool isString;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A component is a part of a Path object, and is used to either
|
||||
* name a property or a field within a property. A component can be either
|
||||
* a single entry, and array, or a map to other sub-fields.
|
||||
*/
|
||||
|
||||
class AppExport Component {
|
||||
|
||||
private:
|
||||
|
||||
enum typeEnum {
|
||||
SIMPLE,
|
||||
MAP,
|
||||
ARRAY
|
||||
} ;
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
Component(const String &_component, typeEnum _type = SIMPLE, int _index = -1, String _key = String());
|
||||
|
||||
static Component SimpleComponent(const char * _component);
|
||||
|
||||
static Component SimpleComponent(const String & _component);
|
||||
|
||||
static Component ArrayComponent(const String &_component, int _index);
|
||||
|
||||
static Component MapComponent(const String &_component, const String &_key);
|
||||
|
||||
// Type queries
|
||||
|
||||
bool isSimple() const { return type == SIMPLE; }
|
||||
|
||||
bool isMap() const { return type == MAP; }
|
||||
|
||||
bool isArray() const { return type == ARRAY; }
|
||||
|
||||
// Accessors
|
||||
|
||||
std::string toString() const;
|
||||
|
||||
std::string getName() const { return name.getString(); }
|
||||
|
||||
std::size_t getIndex() const { return static_cast<std::size_t>(index); }
|
||||
|
||||
String getKey() const { return key; }
|
||||
|
||||
bool getKeyIsString() const { return keyIsString; }
|
||||
|
||||
// Operators
|
||||
|
||||
bool operator==(const Component & other) const;
|
||||
|
||||
private:
|
||||
|
||||
String name;
|
||||
typeEnum type;
|
||||
int index;
|
||||
String key;
|
||||
bool keyIsString;
|
||||
|
||||
friend class ObjectIdentifier;
|
||||
|
||||
};
|
||||
|
||||
ObjectIdentifier(const App::PropertyContainer * _owner = 0, const std::string & property = std::string());
|
||||
|
||||
ObjectIdentifier(const App::Property & prop);
|
||||
|
||||
// Components
|
||||
void addComponent(const Component &c) { components.push_back(c); }
|
||||
|
||||
template<typename C>
|
||||
void addComponents(const C &cs) { components.insert(components.end(), cs.begin(), cs.end()); }
|
||||
|
||||
const std::string getPropertyName() const;
|
||||
|
||||
const Component & getPropertyComponent(int i) const;
|
||||
|
||||
std::string getSubPathStr() const;
|
||||
|
||||
int numComponents() const;
|
||||
|
||||
int numSubComponents() const;
|
||||
|
||||
virtual std::string toString() const;
|
||||
|
||||
std::string toEscapedString() const;
|
||||
|
||||
App::Property *getProperty() const;
|
||||
|
||||
App::ObjectIdentifier canonicalPath() const;
|
||||
|
||||
// Document-centric functions
|
||||
|
||||
void setDocumentName(const String & name, bool force = false);
|
||||
|
||||
const String getDocumentName() const;
|
||||
|
||||
void setDocumentObjectName(const String & name, bool force = false);
|
||||
|
||||
const String getDocumentObjectName() const;
|
||||
|
||||
void renameDocumentObject(const std::string & oldName, const std::string & newName);
|
||||
|
||||
void renameDocument(const std::string &oldName, const std::string &newName);
|
||||
|
||||
App::Document *getDocument(String name = String()) const;
|
||||
|
||||
App::DocumentObject *getDocumentObject() const;
|
||||
|
||||
std::vector<std::string> getStringList() const;
|
||||
|
||||
App::ObjectIdentifier relativeTo(const App::ObjectIdentifier & other) const;
|
||||
|
||||
// Operators
|
||||
|
||||
App::ObjectIdentifier & operator<<(const Component & value);
|
||||
|
||||
bool operator==(const ObjectIdentifier & other) const;
|
||||
|
||||
bool operator!=(const ObjectIdentifier & other) const;
|
||||
|
||||
bool operator<(const ObjectIdentifier &other) const;
|
||||
|
||||
// Getter
|
||||
|
||||
boost::any getValue() const;
|
||||
|
||||
// Setter; is const because it does not alter the object state,
|
||||
// but does have a aide effect.
|
||||
|
||||
void setValue(const boost::any & value) const;
|
||||
|
||||
// Static functions
|
||||
|
||||
static ObjectIdentifier parse(const App::DocumentObject *docObj, const std::string & str);
|
||||
|
||||
protected:
|
||||
|
||||
std::string getPythonAccessor() const;
|
||||
|
||||
void resolve() const;
|
||||
|
||||
App::DocumentObject *getDocumentObject(const App::Document *doc, const std::string &name) const;
|
||||
|
||||
const App::PropertyContainer * owner;
|
||||
bool documentNameSet;
|
||||
bool documentObjectNameSet;
|
||||
std::vector<Component> components;
|
||||
|
||||
/// Mutable elements, updated by resolve()
|
||||
mutable int propertyIndex;
|
||||
mutable String documentName;
|
||||
mutable String documentObjectName;
|
||||
mutable std::string propertyName;
|
||||
|
||||
};
|
||||
|
||||
std::size_t hash_value(const App::ObjectIdentifier & path);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,5 +1,5 @@
|
|||
/***************************************************************************
|
||||
* Copyright (c) Jürgen Riegel (juergen.riegel@web.de) 2002 *
|
||||
* Copyright (c) Jürgen Riegel (juergen.riegel@web.de) 2002 *
|
||||
* *
|
||||
* This file is part of the FreeCAD CAx development system. *
|
||||
* *
|
||||
|
@ -29,7 +29,9 @@
|
|||
|
||||
/// Here the FreeCAD includes sorted by Base,App,Gui......
|
||||
#include "Property.h"
|
||||
#include "ObjectIdentifier.h"
|
||||
#include "PropertyContainer.h"
|
||||
#include <Base/Exception.h>
|
||||
|
||||
using namespace App;
|
||||
|
||||
|
@ -81,6 +83,26 @@ void Property::setContainer(PropertyContainer *Father)
|
|||
father = Father;
|
||||
}
|
||||
|
||||
void Property::setValue(const ObjectIdentifier &path, const boost::any &value)
|
||||
{
|
||||
path.setValue(value);
|
||||
}
|
||||
|
||||
const boost::any Property::getValue(const ObjectIdentifier &path) const
|
||||
{
|
||||
return path.getValue();
|
||||
}
|
||||
|
||||
void Property::getPaths(std::vector<ObjectIdentifier> &paths) const
|
||||
{
|
||||
paths.push_back(App::ObjectIdentifier(getContainer(), getName()));
|
||||
}
|
||||
|
||||
const ObjectIdentifier Property::canonicalPath(const ObjectIdentifier &p) const
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
||||
void Property::touch()
|
||||
{
|
||||
if (father)
|
||||
|
@ -101,6 +123,16 @@ void Property::aboutToSetValue(void)
|
|||
father->onBeforeChange(this);
|
||||
}
|
||||
|
||||
void Property::verifyPath(const ObjectIdentifier &p) const
|
||||
{
|
||||
if (p.numSubComponents() != 1)
|
||||
throw Base::Exception("Invalid property path: single component expected");
|
||||
if (!p.getPropertyComponent(0).isSimple())
|
||||
throw Base::Exception("Invalid property path: simple component expected");
|
||||
if (p.getPropertyComponent(0).getName() != getName())
|
||||
throw Base::Exception("Invalid property path: name mismatch");
|
||||
}
|
||||
|
||||
Property *Property::Copy(void) const
|
||||
{
|
||||
// have to be reimplemented by a subclass!
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
// Std. configurations
|
||||
|
||||
#include <Base/Persistence.h>
|
||||
#include <boost/any.hpp>
|
||||
#include <string>
|
||||
#include <bitset>
|
||||
|
||||
|
@ -35,6 +36,7 @@ namespace App
|
|||
{
|
||||
|
||||
class PropertyContainer;
|
||||
class ObjectIdentifier;
|
||||
|
||||
/** Base class of all properties
|
||||
* This is the father of all properties. Properties are objects which are used
|
||||
|
@ -84,6 +86,19 @@ public:
|
|||
|
||||
/// Get a pointer to the PropertyContainer derived class the property belongs to
|
||||
PropertyContainer *getContainer(void) const {return father;}
|
||||
|
||||
/// Set value of property
|
||||
virtual void setValue(const App::ObjectIdentifier & path, const boost::any & value);
|
||||
|
||||
/// Get value of property
|
||||
virtual const boost::any getValue(const App::ObjectIdentifier & path) const;
|
||||
|
||||
/// Convert p to a canonical representation of it
|
||||
virtual const App::ObjectIdentifier canonicalPath(const App::ObjectIdentifier & p) const;
|
||||
|
||||
/// Get valid paths for this property; used by auto completer
|
||||
virtual void getPaths(std::vector<App::ObjectIdentifier> & paths) const;
|
||||
|
||||
/// Set the property touched
|
||||
void touch();
|
||||
/// Test if this property is touched
|
||||
|
@ -119,6 +134,9 @@ protected:
|
|||
/// Gets called by all setValue() methods before the value has changed
|
||||
void aboutToSetValue(void);
|
||||
|
||||
/// Verify a path for the current property
|
||||
virtual void verifyPath(const App::ObjectIdentifier & p) const;
|
||||
|
||||
private:
|
||||
// forbidden
|
||||
Property(const Property&);
|
||||
|
|
7316
src/App/lex.ExpressionParser.c
Normal file
7316
src/App/lex.ExpressionParser.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user