Вы находитесь на странице: 1из 12

Comparison of parser generators

This is a list of notable lexer generators and parser generators for various language classes.

Contents
Regular languages
Deterministic context-free languages
Parsing expression grammars, deterministic boolean grammars
General context-free, conjunctive, or boolean languages
Context-sensitive grammars
See also
References
Notes
External links

Regular languages
Regular languages are a category of languages (sometimes termed Chomsky Type 3) which can be matched by a state machine (more
specifically, by a deterministic finite automaton or a nondeterministic finite automaton) constructed from a regular expression. In
particular, a regular language can match constructs like "A follows B", "Either A or B", "A, followed by zero or more instances of B",
but cannot match constructs which require consistency between non-adjacent elements, such as "some instances of A followed by the
same number of instances of B", and also cannot express the concept of recursive "nesting" ("every A is eventually followed by a
matching B"). A classic example of a problem which a regular grammar cannot handle is the question of whether a given string
contains correctly-nested parentheses. (This is typically handled by a Chomsky Type 2 grammar, also termed a context-free grammar.)
Grammar, Development
Name Lexer algorithm Output languages License
code platform
Alex DFA Haskell Mixed All Free, BSD
Java virtual
AnnoFlex DFA Java Mixed Free, BSD
machine
AustenX DFA Java Separate All Free, BSD
Booze- state machine is runtime- Free, public
DFA Mixed Python
tools generated or saved as JSON domain
Free, GNU
C# Flex DFA C# Mixed .NET CLR
GPL
C# Lex DFA C# Mixed .NET CLR ?
Java virtual Free, Apache
CookCC DFA Java Mixed
machine 2.0
DFA DFA compressed matrix C++ Separate Windows BSD
Free, Apache
DFAlex DFA no code generation required Java Java
2.0
Dolphin DFA C++ Separate All Proprietary
Flex DFA table driven C, C++ Mixed All Free, BSD
gelex DFA Eiffel Mixed Eiffel Free, MIT
Free, BSD-
golex DFA Go Mixed Go
style
gplex DFA C# Mixed .NET CLR Free, BSD-like
Java virtual
JFlex DFA Java Mixed Free, BSD
machine
Java virtual
JLex DFA Java Mixed Free, BSD-like
machine
Partial,
lex DFA C Mixed POSIX proprietary,
CDDL
Free, GNU
lexertl DFA C++ ? All
LGPL
Free, GNU
Quex DFA direct code C, C++ Mixed All
LGPL
Free, GNU
Ragel DFA C, C++, assembly Mixed All
GPL, MIT[1][1]
DFA direct code, DFA table driven,
RE/flex C++ Mixed All Free, BSD
and NFA regex libraries
Free, public
re2c DFA direct code C Mixed All
domain

Deterministic context-free languages


Context-free languages are a category of languages (sometimes termed Chomsky Type 2) which can be matched by a sequence of
replacement rules, each of which essentially maps each non-terminal element to a sequence of terminal elements and/or other
nonterminal elements. Grammars of this type can match anything that can be matched by a regular grammar, and furthermore, can
handle the concept of recursive "nesting" ("every A is eventually followed by a matching B"), such as the question of whether a given
string contains correctly-nested parentheses. The rules of Context-free grammars are purely local, however, and therefore cannot handle
questions that require non-local analysis such as "Does a declaration exist for every variable that is used in a function?". To do so
technically would require a more sophisticated grammar, like a Chomsky Type 1 grammar, also termed a context-sensitive grammar.
However, parser generators for context-free grammars often support the ability for user-written code to introduce limited amounts of
context-sensitivity. (For example, upon encountering a variable declaration, user-written code could save the name and type of the
variable into an external data structure, so that these could be checked against later variable references detected by the parser.)

The deterministic context-free languages are a proper subset of the context-free languages which can be efficiently parsed by
deterministic pushdown automata.
Input
Output Grammar, Development
Name Parsing algorithm grammar Lexer IDE License
languages code platform
notation
C#, Java,
Python,
Java virtual
ANTLR4 ALL(*)[2] EBNF JavaScript, Mixed generated
machine
Yes Free, BSD
C++, Swift,
Go, PHP
ActionScript,
Ada95, C,
C++, C#,
Java,
Java virtual
ANTLR3 LL(*) EBNF JavaScript, Mixed generated Yes Free, BSD
machine
Objective-C,
Perl,
Python,
Ruby
C, C++,
Recursive descent, Free, GNU
APG ABNF JavaScript, Separate none All No
backtracking GPL
Java
Any with
C++17 or
C++17, Free,
AXE Recursive descent AXE/C++ Mixed none C++11 No
C++11 Boost
standard
compiler
Java virtual
Beaver LALR(1) EBNF Java Mixed external No Free, BSD
machine
Partial,
C++17,
Belr Recursive descent ABNF Separate included POSIX No GNU GPL,
C++11
proprietary
Free, GNU
LALR(1), LR(1), C, C++,
Bison Yacc Mixed external All No GPL with
IELR(1), GLR Java
exception
Free, GNU
Bison++[note 1] LALR(1) ? C++ Mixed external POSIX No
GPL
Free, GNU
Bisonc++ LALR(1) ? C++ Mixed external POSIX No
GPL
State
machine
BNF with
can be Free,
LALR(1) or LR(1) macros in Mixed,
Booze-tools runtime- included Python No public
canonical or minimal place of separable
generated domain
EBNF
or saved as
JSON
Free,
Backtracking Bottom-
BtYacc ? C++ Mixed external All No public
up
domain
Free,
byacc LALR(1) Yacc C Mixed external All No public
domain
Free,
BYACC/J LALR(1) Yacc C, Java Mixed external All No public
domain
Common
CL-Yacc LALR(1) Lisp Mixed external All No Free, MIT
Lisp
C, C++, C#,
F#, Java, Java virtual
Ada, Object machine,
Pascal, .NET
Delphi, Framework,
Free, GNU
Coco/R LL(1) EBNF Modula-2, Mixed generated Windows, No
GPL
Oberon, POSIX
Ruby, Swift, (depends on
Unicon, output
Visual Basic language)
.NET
Free,
Java Java virtual
CookCC LALR(1) Java Mixed generated No Apache
annotations machine
2.0
CppCC LL(k) ? C++ Mixed generated POSIX No Free, GNU
GPL
Free,
CSP LR(1) ? C++ Separate generated POSIX No Apache
2.0
Java virtual Free,
CUP LALR(1) ? Java Mixed external No
machine BSD-like
Free, GNU
Dragon LR(1), LALR(1) ? C++, Java Separate generated All No
GPL
Free, GNU
eli LALR(1) ? C Mixed generated POSIX No GPL, GNU
LGPL
Essence LR(?) ? Scheme 48 Mixed external All No Free, BSD
N/A (state
BNF, EBNF machine is .NET
Eto.Parse LL(k) Separate internal No Free, MIT
or C# runtime Framework
generated)
external
Free,
eyapp LALR(1) ? Perl Mixed or All No
Artistic
generated
Free, GNU
Frown LALR(k) ? Haskell 98 Mixed external All No
GPL
geyacc LALR(1) ? Eiffel Mixed external All No Free, MIT
x86
assembly
language,
ANSI C, C#,
D, Java,
Pascal,
Free, zlib
GOLD LALR(1) BNF Object Separate generated Windows Yes
modified
Pascal,
Python,
Visual Basic
6, Visual
Basic .NET,
Visual C++
GPPG LALR(1) Yacc C# Separate external Windows Yes Free, BSD
Java virtual
Grammatica LL(k) BNF dialect C#, Java Separate generated No Free, BSD
machine
EBNF or Java virtual Free, GNU
HiLexed LL(*) Java Separate internal No
Java machine LGPL
.NET
Hime Parser C#, Java, Framework, Free, GNU
LALR(1), GLR BNF dialect Separate generated No
Generator Rust Java virtual LGPL
machine
LR(1), LALR(1), Free, GNU
Hyacc Yacc C Mixed external All No
LR(0) GPL
N/A (state
machine is .NET
Irony LALR(1) C# Separate internal Yes Free, MIT
runtime Framework
generated)
Free, GNU
iyacc LALR(1) Yacc Icon Mixed external All No
LGPL
Java virtual
jacc LALR(1) ? Java Mixed external No Free, BSD
machine
Java, C++,
JavaScript Java virtual
JavaCC LL(k) EBNF Mixed generated Yes Free, BSD
(via GWT machine
compiler)[3]
Java virtual
jay LALR(1) Yacc C#, Java Mixed none No Free, BSD
machine
Java virtual
JFLAP LL(1), LALR(1) ? Java ? ? Yes ?
machine
Free, GNU
JetPAG LL(k) ? C++ Mixed generated All No
GPL
JS/CC LALR(1) EBNF JavaScript, Mixed internal All Yes Free, BSD
JScript,
ECMAScript
generated
KDevelop-PG- LL(1), backtracking, Free, GNU
? C++ Mixed or All, KDE No
Qt shunting-yard LGPL
external
Backtracking Free, GNU
Kelbt ? C++ Mixed generated POSIX No
LALR(1) GPL
C, Java,
Free, GNU
kmyacc LALR(1) ? Perl, Mixed external All No
GPL
JavaScript
C, C++, C#,
Java virtual Free, GNU
Lapg LALR(1) ? Java, Mixed generated No
machine GPL
JavaScript
Python (no
LALR(1), Earley,
Lark EBNF generation, Separate none All No Free, MIT
CYK
library)
Free,
Lemon LALR(1) ? C Mixed external All No public
domain
Python (no Free,
LEPL Recursive descent Python generation, Separate none All No MPL, GNU
library) LGPL
Free, GNU
Lime LALR(1) ? PHP Mixed external All No
GPL
Free,
LR(?), LL(?), Java virtual
LISA ? Java Mixed generated Yes public
LALR(?), SLR(?) machine
domain
LLgen LL(1) ? C Mixed external POSIX No Free, BSD
Free, GNU
LLnextgen LL(1) ? C Mixed external All No
GPL
.NET
LL(k) + syntactic and generated Visual Free, GNU
LLLPG ANTLR-like C# Mixed Framework,
semantic predicates (?) Studio LGPL
Mono
Backtracking Java virtual
LPG ? Java Mixed generated No Free, EPL
LALR(k) machine
EBNF, Visual
LRGEN LR(1), C++ Separate generated Windows BSD
TBNF Studio
EBNF, Visual
LRSTAR MLR(1), MLR(*) C++ Separate generated Windows BSD
TBNF Studio
Menhir LR(1) ? OCaml Mixed generated All No Free, QPL
ML-Yacc LALR(1) ? ML Mixed external All No ?
Java virtual Free, GNU
Monkey LR(1) ? Java Separate generated No
machine GPL
external
YACC, POSIX, Free, GNU
Msta LALR(k), LR(k) C, C++ Mixed or No
EBNF Cygwin GPL
generated
MTP (More Java virtual Free, GNU
LL(1) ? Java Separate generated No
Than Parsing) machine GPL
Any with
standard
MyParser LL(*) Markdown C++11 Separate internal No Free, MIT
C++11
compiler
C#/BNF- .NET
NLT GLR C# Mixed mixed No Free, MIT
like Framework
ocamlyacc LALR(1) ? OCaml Mixed external All No Free, QPL
Free, GNU
olex LL(1) ? C++ Mixed generated All No
GPL
N/A (state
Scannerless BNF-like, machine is
parglare Mixed none All No Free, MIT
LALR(1)/SLR(1)/GLR Python runtime
generated)
Parsec LL, backtracking Haskell Haskell Mixed none All No Free, BSD
Free, GNU
Parse::Yapp LALR(1) ? Perl Mixed external All No
GPL
Parser Objects LL(k) ? Java Mixed ? Java virtual No Free, zlib
machine
PCCTS LL ? C, C++ ? ? All No ?
PLY LALR(1) BNF Python Mixed generated All No Free, MIT
PlyPlus LALR(1) EBNF Python Separate generated All No Free, MIT
Free, GNU
PRECC LL(k) ? C Separate generated DOS, POSIX No
GPL
Free, GNU
QLALR LALR(1) ? C++ Mixed external All No
GPL
C (no
Recursive descent, Free, GNU
RPATK BNF generation, Separate none All No
backtracking GPL
library)
C, C++, C#,
Java, Java virtual Free, GNU
SableCC LALR(1) ? Separate generated No
OCaml, machine LGPL
Python
C, C++, C#,
SLK[4] LL(k) LR(k) LALR(k) EBNF Java, Separate external All No SLK[5]
JavaScript
SP (Simple Free, GNU
Recursive descent Python Python Separate generated All No
Parser) LGPL
Free,
Spirit Recursive descent ? C++ Mixed internal All No
Boost
.NET
Sprache LL, backtracking C# interpreted Mixed internal No Free, MIT
Framework
Free, GNU
Styx LALR(1) ? C, C++ Separate generated All No
LGPL
Sweet Parser LALR(1) ? C++ Separate generated Windows No Free, zlib
Free, GNU
Tap LL(1) ? C++ Mixed generated All No
GPL
TextTransformer LL(k) ? C++ Mixed generated Windows Yes Proprietary
C#, Visual Partial,
TinyPG LL(1) ? ? ? Windows Yes
Basic CPOL 1.0
Toy Parser Free, GNU
Recursive descent ? Python Mixed generated All No
Generator LGPL
Turbo Free, GNU
TP Yacc LALR(1) ? Mixed external All Yes
Pascal GPL
Tunnel
Recursive descent,
Grammar ABNF C++ Separate generated Windows Yes Proprietary
backtracking
Studio
C++, Java, Free,
UltraGram LALR(1), LR(1), GLR BNF C#, Visual Separate external Windows Yes public
Basic .NET domain
C, C++,
Python,
UniCC LALR(1) EBNF Mixed generated POSIX No Free, BSD
JavaScript,
JSON, XML
Java virtual
UrchinCC LL(1) ? Java ? generated No ?
machine
LR(?), some
Whale conjunctive stuff, see ? C++ Mixed external All No Proprietary
Whale Calf
Free, GNU
wisent LALR(1) ? C++, Java Mixed external All No
GPL
Free, CPL
Yacc AT&T/Sun LALR(1) Yacc C Mixed external POSIX No
& CDDL
generated
Yacc++ LR(1), LALR(1) Yacc C++, C# Mixed or All No Proprietary
external
Yapps LL(1) ? Python Mixed generated All No Free, MIT
yecc LALR(1) ? Erlang Separate generated All No Free,
Apache
2.0
.NET
Visual BNF LR(1), LALR(1) ? C# Separate generated Yes Proprietary
Framework
YooParse LR(1), LALR(1) ? C++ Mixed external All No Free, MIT
Parse (https://gi C++11
BNF in
thub.com/Mathi LR(1) ? ? none standard No Free, MIT
C++ types
asVP/Parse/) compiler
GGLL LL(1) Graph Java Mixed generated Windows Yes Free, MIT
Input
Output Grammar, Development
Product Parsing algorithm grammar Lexer IDE License
languages code platform
notation

Parsing expression grammars, deterministic boolean grammars


This table compares parser generators with parsing expression grammars, deterministic boolean grammars.
Grammar, Development
Name Parsing algorithm Output languages License
code platform
Python (no generation,
Arpeggio PEG parser interpreter, Packrat Mixed All Free, MIT
interpreted)
AustenX Packrat (modified) Java Separate All Free, BSD
Free, GNU
Aurochs Packrat C, OCaml, Java Mixed All
GPL
BNFlite Recursive descent C++ Mixed All Free, MIT
Java, JavaScript, Python, Free, GNU
Canopy Packrat Separate All
Ruby GPL
CL-peg Packrat Common Lisp Mixed All Free, MIT
Free, GNU
Drat! Packrat D Mixed All
GPL
Frisby Packrat Haskell Mixed All Free, BSD
grammar::peg Packrat Tcl Mixed All Free, BSD
Grako Packrat + Cut + Left Recursion Python, C++ (beta) Separate All Free, BSD
IronMeta Packrat C# Mixed Windows Free, BSD
Packrat (modified), mutating Free, public
Katahdin C# Mixed All
interpreter domain
2-phase scannerless top-down Free, GNU
Laja Java Separate All
backtracking + runtime support GPL
Packrat (supporting left-recursion and
lars::Parser C++ Identical All Free, BSD
grammar ambiguity)
LPeg Parsing machine Lua Mixed All Free, MIT
lug Parsing machine C++17 Mixed All Free, MIT
Java virtual Free, Apache
Mouse Recursive descent Java Separate
machine 2.0
POSIX,
Narwhal Packrat C Mixed Free, BSD
Windows
Nearley Earley JavaScript Mixed All Free, MIT
Nemerle.Peg Recursive descent + Pratt Nemerle Separate All Free, BSD
neotoma Packrat Erlang Separate All Free, MIT
NPEG Recursive descent C# Mixed All Free, MIT
Packrat (modified, partial JavaScript, Squeak,
OMeta Mixed All Free, MIT
memoization) Python
PackCC Packrat (modified) C Mixed All Free, MIT
Packrat Packrat Scheme Mixed All Free, MIT
Pappy Packrat Haskell Mixed All Free, BSD
Java virtual Free, Apache
parboiled Recursive descent Java, Scala Mixed
machine 2.0
Java virtual Free, Apache
Lambda PEG Recursive descent Java Mixed
machine 2.0
Free, public
parsepp Recursive descent C++ Mixed All
domain
Free, GNU
Parsnip Packrat C++ Mixed Windows
GPL
peg Recursive descent C Mixed All Free, MIT
PEG.js Packrat (partial memoization) JavaScript Mixed All Free, MIT
peg-parser PEG parser interpreter Dylan Separate All ?
Recursive descent, Packrat
Pegasus C# Mixed Windows Free, MIT
(selectively)
Free, public
pegc Recursive descent C Mixed All
domain
pest Recursive descent Rust Separate All Free, MPL
PetitParser Packrat Smalltalk, Java, Dart Mixed All Free, MIT
PEGTL Recursive descent C++11 Mixed All Free, MIT
Parser Grammar Hybrid recursive descent / operator Parrot virtual Free, Artistic
Parrot bytecode Mixed
Engine (PGE) precedence[6] machine 2.0
PyPy rlib Packrat Python Mixed All Free, MIT
Free, GNU
pyPEG PEG parser interpreter, Packrat Python Mixed All
GPL
Java virtual Free, GNU
Rats! Packrat Java Mixed
machine LGPL
Spirit2 Recursive descent C++ Mixed All Free, Boost
Python (no generation,
textX PEG parser interpreter, Packrat Separate All Free, MIT
interpreted)
Treetop Recursive descent Ruby Mixed All Free, MIT
Free, MIT or
Yard Recursive descent C++ Mixed All
public domain
C, Java, JavaScript,
Waxeye Parsing machine Separate All Free, MIT
Python, Racket, Ruby
PHP PEG PEG Parser? PHP Mixed All Free, BSD

General context-free, conjunctive, or boolean languages


This table compares parser generator languages with a general context-free grammar, a conjunctive grammar, or a boolean grammar.
Input
Output Grammar, Development
Name Parsing algorithm grammar Lexer IDE License
languages code platform
notation
Yacc Free, GNU
ACCENT Earley C Mixed external All No
variant GPL
Free,
APaGeD GLR, LALR(1), LL(k) ? D Mixed generated All No
Artistic
Mixed,
LALR(1), LR(1), C, C++, Free, GNU
Bison Yacc except external All No
IELR(1), GLR Java, XML GPL
XML
DMS Software
Reengineering GLR ? Parlanse Mixed generated Windows No Proprietary
Toolkit
DParser Scannerless GLR ? C Mixed scannerless POSIX No Free, BSD
Runtime-extensible Free,
Dypgen ? OCaml Mixed generated All No
GLR CeCILL-B
external, or
E3 Earley ? OCaml Mixed All No ?
scannerless
C++,
Elkhound GLR ? Mixed external All No Free, BSD
OCaml
N/A (state
machine is .NET
eu.h8me.Parsing GLR ? Separate external No Free, BSD
runtime Framework
generated)
C, Lex,
Haskell,
HTML,
GDK LALR(1), GLR ? Java, Mixed generated POSIX No Free, MIT
Object
Pascal,
Yacc
Happy LALR, GLR ? Haskell Mixed external All No Free, BSD
.NET
Hime Parser C#, Java, Framework, Free, GNU
GLR ? Separate generated No
Generator Rust Java virtual LGPL
machine
generated .NET Free,
IronText Library LALR(1), GLR C# C# Mixed No
or external Framework Apache 2.0
LALR(1), LR(0), JavaScript,
Jison Yacc Mixed generated All No Free, MIT
SLR(1) C#, PHP
JavaScript,
LALR(1), LR(0), Python,
Syntax SLR(1) CLR(1) JSON/Yacc PHP, Ruby, Mixed generated All No Free, MIT
LL(1) C#, Rust,
Java
Scannerless, two Free, GNU
Laja Laja Java Separate scannerless All No
phase GPL
Annotated
ModelCC Earley class Java Generated generated All No Free, BSD
model
Python
interpreted,
Scannerless
parglare BNF-like automata Mixed scannerless All No Free, MIT
LR/GLR
run-time
generated
external, or
P1 Combinators BNF-like OCaml Mixed All No ?
scannerless
external, or
P3 Earley–combinators BNF-like OCaml Mixed All No ?
scannerless
Earley–combinators, external, or
P4 BNF-like OCaml Mixed All No ?
infinitary CFGs scannerless
Scannerless Scannerless GLR Haskell, Java virtual
? Separate scannerless No Free, BSD
Boolean Parser (Boolean grammars) Java machine
SDF/SGLR Scannerless GLR SDF C, Java Separate scannerless All Yes Free, BSD
SmaCC GLR(1), LALR(1), ? Smalltalk Mixed internal All Yes Free, MIT
LR(1)
SPARK Earley ? Python Mixed external All No Free, MIT
Free, "No
licensing or
Tom GLR ? C Generated none All No
copyright
restrictions"
C++, C#,
UltraGram LALR, LR, GLR ? Java, Visual Separate generated Windows Yes Proprietary
Basic .NET
Pruning, LR, GLR,
Wormhole ? C, Python Mixed scannerless Windows No Free, MIT
Scannerless GLR
General tabular,
SLL(k), Linear
normal form
Whale Calf (conjunctive ? C++ Separate external All No Proprietary
grammars), LR,
Binary normal form
(Boolean grammars)
Free, GNU
yaep Earley Yacc-like C Mixed external All No
LGPL
Recursive pattern Linkable
Zecc Zecc/Zacc Mixed Scannerless macOS Yes Proprietary
matching library

Context-sensitive grammars
This table compares parser generators with context-sensitive grammars.

Boolean Development
Name Parsing algorithm Input grammar notation License
grammar abilities platform
Conjunctive, not
LuZc[7][8] delta chain modular POSIX Proprietary
complimentary
LR(*) + dynamic-symbol-
LRSTAR EBNF, Yacc, Antlr ? Windows Proprietary
table
bnf2xml (http://sourcefor Recursive descent (is a text simple BNF grammar (input Beta, and not a full Free, GNU
?
ge.net/p/bnf2xml/) filter output is xml) matching), output is xml EBNF parser GPL

See also
Compiler-compiler
List of lexer generators

References
1. http://www.colm.net/open-source/ragel/
2. "Adaptive LL(*) Parsing: The Power of Dynamic Analysis" (http://www.antlr.org/papers/allstar-techreport.pdf) (PDF).
Terence Parr. Retrieved 2016-04-03.
3. "Building parsers for the web with JavaCC & GWT (Part one)" (http://consoliii.blogspot.co.uk/2014/04/creating-gwt-com
patible-parser-using.html). Chris Ainsley. Retrieved 2014-05-04.
4. "The SLK Parser Generator supports C, C++, Java, JavaScript, and C#, optional backtracking, free" (http://www.H8dem
s.com/).
5. http://www.H8dems.com/license.txt
6. "Parrot: Grammar Engine" (https://parrot.github.com/html/docs/book/pct/ch04_pge.pod.html). The Parrot Foundation.
2011. "PGE rules provide the full power of recursive descent parsing and operator precedence parsing."
7. "LuZ: A context sensitive parser" (https://web.archive.org/web/20161017051112/http://qyxz.netau.net/). 2016-10-17.
Archived from the original (http://qyxz.netau.net/) on 2016-10-17. Retrieved 2018-10-17.
8. "LuZc – A conjunctive context-sensitive parser" (http://luzc.zohosites.com/). luzc.zohosites.com. Retrieved 2018-10-17.

Notes
1. Bison 1.19 fork
External links
The Catalog of Compiler Construction Tools (http://catalog.compilertools.net/lexparse.html)
Open Source Parser Generators in Java (http://java-source.net/open-source/parser-generators)

Retrieved from "https://en.wikipedia.org/w/index.php?title=Comparison_of_parser_generators&oldid=946164171"

This page was last edited on 18 March 2020, at 14:15 (UTC).

Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of
Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.

Вам также может понравиться