Wolfram Language Paclet Repository

Community-contributed installable additions to the Wolfram Language

Primary Navigation

    • Cloud & Deployment
    • Core Language & Structure
    • Data Manipulation & Analysis
    • Engineering Data & Computation
    • External Interfaces & Connections
    • Financial Data & Computation
    • Geographic Data & Computation
    • Geometry
    • Graphs & Networks
    • Higher Mathematical Computation
    • Images
    • Knowledge Representation & Natural Language
    • Machine Learning
    • Notebook Documents & Presentation
    • Scientific and Medical Data & Computation
    • Social, Cultural & Linguistic Data
    • Strings & Text
    • Symbolic & Numeric Computation
    • System Operation & Setup
    • Time-Related Computation
    • User Interface Construction
    • Visualization & Graphics
    • Random Paclet
    • Alphabetical List
  • Using Paclets
    • Get Started
    • Download Definition Notebook
  • Learn More about Wolfram Language

FunctionalParsers

Guides

  • Functional parsers

Tech Notes

  • Интерпретатори на желания за храни
  • Food cravings grammar and interpreters
  • Парсване на имена на цели числа
  • Integer names parsing

Symbols

  • AddParserModifier
  • EBNFAlternativesInterpreter
  • EBNFAlternatives
  • EBNFContextRules
  • EBNF
  • EBNFNonTerminalInterpreter
  • EBNFNonTerminal
  • EBNFOptionInterpreter
  • EBNFOption
  • EBNFRepetitionInterpreter
  • EBNFRepetition
  • EBNFRuleInterpreter
  • EBNFRule
  • EBNFSequenceInterpreter
  • EBNFSequence
  • EBNFTerminalInterpreter
  • EBNFTerminal
  • GenerateParsersFromEBNF
  • GrammarNormalize
  • GrammarRandomSentences
  • InterpretWithContext
  • ParseAlternativeComposition
  • ParseApply
  • ParseBracketed
  • ParseChain1Left
  • ParseChainLeft
  • ParseChainRight
  • ParseChoice
  • ParseComposeWithResults
  • ParseCurlyBracketed
  • ParseEBNF
  • ParseEpsilon
  • ParseFail
  • ParseFuzzySymbol
  • ParseJust
  • ParseListOf
  • ParseMany1
  • ParseManyByBranching
  • ParseMany
  • ParseModify
  • ParseOption1
  • ParseOption
  • ParsePack
  • ParseParenthesized
  • ParsePredicate
  • ParseRecursiveDefinition
  • ParseSequentialComposition
  • ParseSequentialCompositionPickLeft
  • ParseSequentialCompositionPickRight
  • ParseShortest
  • ParseSome
  • ParseSpaces
  • ParseSucceed
  • ParseSymbol
  • ParseToEBNFTokens
  • ParseToken
  • ParseToTokens
  • ParsingTestTable
  • SetParserModifier
  • ToTokens
Интерпретатори на желания за храни
Въведение
Генериране на случайни изречения
Граматика
Интерпретиране
Въведение
В тази тетрадка (на англ. "notebook") ще покажем как може да се създаде граматика за прост, специфичен език (на агнл., "Domain Specific Language" или "DSL"), който съдържа изречения, обявяващи желания за различни храни и пристрастията към тях.
Инсталирай пакета (паклета)
In[1]:=
PacletInstall["AntonAntonov/FunctionalParsers"]
Out[1]=
PacletObject
Name: AntonAntonov/FunctionalParsers
Version: 1.0.2

Зареди пакета (паклета)
In[2]:=
Needs["AntonAntonov`FunctionalParsers`"]
Граматика
Тук е представянето в Разширена Бакус-Наур Форма (РБНФ) (англ. "EBNF") на специфичен ("домейн") език (DSL) за желания за храна:
In[3]:=
ebnfCode=" <lovefood> = [ <subject> ] , <loveverb> , <object-spec> <@ LoveFood[Flatten[#]]& ; <loveverb> = ( 'обичам' | 'обичаме' | 'обичаш' | 'желая' | 'желаем' | 'желаеш' | 'настоявам' | 'настояваме' | 'настояваш' | 'искам' | 'искаме' | 'искаш' ) <@ LoveType ; <object-spec> = ( <object-list> | <object> | <objects> | <objects-mult> ) <@ LoveObjects[Flatten[{#}]]& ; <subject> = 'аз' | 'ние' | 'ти' <@ Who ; <object> = 'суши' | 'шоколад' | 'мляко' | 'сладолед' | 'мандарина' ; <objects> = 'суши' | 'шоколади' | 'шоколада' | 'млека' | 'сладоледи' | 'сладоледа' | 'мандарини' ; <objects-mult> = 'Range[2,100]' , <objects> <@ Mult ; <object-list> = ( <object> | <objects> | <objects-mult> ) , { 'и' &> ( <object> | <objects> | <objects-mult> ) } ; ";
Тук се генерират парсери от низа с РБНФ:
In[4]:=
GenerateParsersFromEBNF

ParseToTokens
@ebnfCode;
Тук се тества парсера
pLOVEFOOD
-- за най-горното правило "<lovefood>" -- със списък от изречения:
In[5]:=
sentences="Обичам мляко","Искаме 2 сладоледа","Аз искам 2 сладоледа и 5 шоколада","Обичаш шоколад и мляко";
ParsingTestTable
[pLOVEFOOD,ToLowerCase@sentences,"Layout""Vertical"]
Out[5]=
1
command:
обичам мляко
parsed:
LoveFoodLoveType[обичам],LoveObjects[{мляко}]
residual:
{}
2
command:
искаме 2 сладоледа
parsed:
LoveFoodLoveType[искаме],LoveObjectsMult2,сладоледа
residual:
{}
3
command:
аз искам 2 сладоледа и 5 шоколада
parsed:
LoveFoodWho[аз],LoveType[искам],LoveObjectsMult2,сладоледа,Mult5,шоколада
residual:
{}
4
command:
обичаш шоколад и мляко
parsed:
LoveFoodLoveType[обичаш],LoveObjectsшоколад,мляко
residual:
{}
Обърнете внимание на обвивките
LoveFood
,
LoveType
,
LoveObjects
-- това са символи, специфицирани в края на някои от РБНФ правилата.
Генериране на случайни изречения
Туке се генерират случайни изречения с граматиката по-горе:
In[6]:=
SeedRandom[3];​​
GrammarRandomSentences

GrammarNormalize
[ebnfCode],12//Sort//ColumnForm
Out[7]=
обичаме суши
настоявам суши
настояваш шоколади
ти настояваш мандарини
ние настоявам сладоледи
желаеш 20 сладоледи и 40 сладоледа
обичаме шоколада и 33 сладоледи и 100 шоколада
обичаме 40 сладоледи
ние настояваш 41 сладоледа
желаем млека и мандарини и суши и мляко и 42 шоколади и млека
аз желаем 55 сладоледа
ние желаем 7 сладоледа
Интерпретиране
Можем да прорграмираме интерпретатори, които показват приемането на калории за обявените хранителни пристрастия и желания. Можем да използваме функцията WolframAlpha, за да получим калориите, но тъй като функцията WolframAlpha може да бъде бавна, тя е пренаписана в Block-а.
Интерпретатор за
LoveObjects
In[8]:=
Clear[LoveObjectsCalories];LoveObjectsCalories[parsed_]:=Block[{res,wares,WolframAlpha={}&},res=(StringJoin@@Flatten[Riffle[parsed," and "]/.Mult[{x_,y_}](StringJoin@@Riffle[Flatten[{ToString[x],y}]," "])]);wares=WolframAlpha[res<>" calories","DataRules",TimeConstraint60];{{"Result",1},"ComputableData"}/.wares/.{{"Result",1},"ComputableData"}Quantity[RandomInteger[{20,1200}],"LargeCalories"]​​];
Интерпретатор за
LoveFood
In[9]:=
Clear[LoveFoodCalories];​​LoveFoodCalories[parsed_]:=​​Block{who,type},​​type=Cases[parsed,LoveType[id_]id,∞]1;​​​​who=Cases[parsed,Who[id_]id,∞];​​If[Length[who]>0,​​who=First[who],​​(*ELSE*)​​who=Which[​​StringEndsQ[type,"ме"],"ние",​​StringEndsQ[type,"ш"],"ти",​​StringEndsQ[type,"м"],"аз"​​]​​];​​​​Which​​who"ти",Row[{"Не. Аз съм машина."}],​​StringStartsQ[type,"обич"],Row"Вие наддавате с ",Sqrt[1*10.]parsed-1," на ден.",​​True,Row"Вие наддавате с ",parsed-1,"."​​​​;
Тук тестовете за парсиране по-горе са приложени отново, но с променени дефиниции на опаковащите символи LoveFood и LoveObjects:
In[11]:=
Block{LoveFood=LoveFoodCalories,LoveObjects=LoveObjectsCalories},​​
ParsingTestTable
[pLOVEFOOD,ToLowerCase@sentences,"Layout""Vertical"]​​
Out[11]=
1
command:
обичам мляко
parsed:
Ви наддавате с
218.197
Cal
на ден.
residual:
{}
2
command:
искаме 2 сладоледа
parsed:
Вие наддавате с
960
Cal
.
residual:
{}
3
command:
аз искам 2 сладоледа и 5 шоколада
parsed:
Вие наддавате с
1127
Cal
.
residual:
{}
4
command:
обичаш шоколад и мляко
parsed:
Не. Аз съм машина.
residual:
{}
RelatedGuides
▪
Functional parsers

© 2025 Wolfram. All rights reserved.

  • Legal & Privacy Policy
  • Contact Us
  • WolframAlpha.com
  • WolframCloud.com