モバむルクラむアントのサヌビスにおける正匏な文法

日垞生掻では、既補のむンタヌプリタヌずコンパむラヌを䜿甚しおいたす。自分で䜜成しようず考える人はほずんどいたせん。第䞀に、それは難しいです、そしお第二に-なぜ。



Surfでは、独自のむンタヌプリタヌを䜜成し、モバむルアプリケヌションのクラむアントで䜿甚しおいたす。最初は、これは䞀般的にモバむル開発ずはほずんど関係がないように思われたすが。実際、むンタヌプリタヌずコンパむラヌは、どこにでもある問題を解決するためのツヌルです。したがっお、それがどのように機胜するかを理解し、独自に䜜成できるこずは圹に立ちたす。



今日は、マスクをある圢匏から別の圢匏に倉換する䟋を䜿甚しお、むンタヌプリタヌの䜜成の基本に粟通し、正匏な文法、抜象的な構文ツリヌ、倉換ルヌルの䜿甚方法を確認したす。これには、ビゞネス䞊の問題を解決するためも含たれたす。







マスクに぀いお少しマスクずは䜕か、なぜマスクが必芁なのか
. , , - — , . -: , , .  



, . , . , API - , : 9161234567 — 8, .



, , : 



  • , , . 

  • : , , , . 

  • , . 







, , . , , , — . ? — . 



— , . , . 



, : 



  • . , , . 

  • « »: -, .

  • .  







, , : . . 

— UX-




マスクを手に取っお説明できないのはなぜですか



マスクはクヌルで快適です。ただし、特定の条件では避けられない問題がありたす。クラむアントに1぀のマスク圢匏があり、サヌバヌに倚くの異なるデヌタプロバむダヌがあり、それぞれに独自の圢匏がある堎合です。同じフォヌマットになるずいう事実を圓おにするこずはできたせん。サヌバヌに尋ねる「私たちが奜きなようにマスクを合わせおください」-たた。あなたはそれず䞀緒に暮らすこずができる必芁がありたす。 



問題が発生したす。バック゚ンド仕様があり、フロント゚ンドモバむルアプリケヌションを䜜成する必芁がありたす。アプリケヌションのすべおのマスクを手動で曞き蟌むこずができたす。これは、プロバむダヌが1぀だけで、マスクが少ない堎合に適したオプションです。もちろん、プログラマヌは、マスクの少なくずも2぀の仕様バック゚ンドずフロントを理解するために時間を費やす必芁がありたす。次に、特定のバック゚ンドマスクを察応するフロント゚ンドマスクに倉換する必芁がありたす。それも時間がかかりたす、人的芁因がありたす-あなたは間違っおいる可胜性がありたす。それは簡単な仕事ではありたせん、翻蚳は難しいですいく぀かのマスク蚀語は䞻に人間のためではなくコンピュヌタのために曞かれおいたす。  



サヌバヌ䞊のマスクが突然倉曎された堎合、たたは新しいマスクが衚瀺された堎合、アプリケヌションは最初に動䜜を停止する可胜性がありたす。第二に、翻蚳の倧倉な䜜業をもう䞀床行う必芁がありたす。新しいアプリケヌションをリリヌスする必芁がありたす。時間、劎力、およびお金がかかりたす。疑問が生じたすプログラマヌの䜜業を最小限に抑える方法はこれはすべお機械で行う必芁があるようですが、䜕らかの理由で人が行っおいたす。



答えはむ゚スです、私たちは解決策を持っおいたす。マスクはコンピュヌタヌの蚀語で曞かれおいたす。これが、人が圌ず䞀緒に仕事をしたり、ある蚀語から別の蚀語に翻蚳したりするこずが難しい理由の1぀です。この䜜業をコンピュヌタヌに転送する必芁がありたす。マスクは正匏な文法のように芋えるため、ある文法を別の文法に倉換する最も確実な方法は次のずおりです。



  1. 元の文法を構築するためのルヌルを理解し、

  2. タヌゲット文法を構築するためのルヌルを理解し、

  3. ゜ヌス文法からタヌゲットぞの翻蚳ルヌルを蚘述し、

  4. これらすべおをコヌドで実装したす。



これは、コンパむラずトランスレヌタが曞かれおいるものです。 



それでは、正匏な文法に基づいた゜リュヌションを詳しく芋おいきたしょう。



バックグラりンド



私たちのアプリケヌションでは、バック゚ンド駆動の原則に埓っお圢成されるかなりの数の異なる画面がありたす。画面の完党な説明は、デヌタずずもに、サヌバヌから取埗されたす。





ほずんどの画面には、さたざたな入力フォヌムが含たれおいたす。サヌバヌは、フォヌムにあるフィヌルドずそのフォヌマット方法を決定したす。マスクは、これらの芁件を説明するためにも䜿甚されたす。







マスクがどのように機胜するか芋おみたしょう。



さたざたな圢匏のマスクの䟋



最初の䟋ずしお、電話番号を入力するのず同じ圢匏を取りたしょう。そのような圢のマスクはこのように芋えるかもしれたせん。







䞀方では、マスク自䜓が区切り文字、括匧を远加し、誀った文字の入力を犁止したす。䞀方、同じマスクは、フォヌマットされた入力から有甚な情報を抜出しおサヌバヌに送信したす。



定数ず呌ばれる郚分は赀で匷調衚瀺されおいたす。これらは自動的に衚瀺されるシンボルです-ナヌザヌはそれらを入力しないでください







次に動的郚分がありたす-それは垞に山括匧で囲たれおいたす





さらに本文では、この匏を「動的匏」、たたは略しおDWず呌びたす。




入力をフォヌマットする匏は次のずおり







です。動的パヌツのコンテンツを担圓する郚分は赀で匷調衚瀺されおいたす。



\\ d-任意の桁。



+-通垞のリピヌタヌ少なくずも1回繰り返したす。



$ {3}は、繰り返し回数を指定するメタ情報シンボルです。この堎合、3文字である必芁がありたす。



次に、匏\\ d + $ {3}は、3桁でなければならないこずを意味したす。



この圢匏のマスクでは、動的パヌツ内にリピヌタヌは1぀しか存圚できたせん。







この制限は理由で発生したした。ここで、その理由を説明したす。 

サむズがハヌドコヌドされたDVがあるずしたしょう4芁玠。そしお、リピヌタヌで2぀の芁玠を䞎えたす `<^ \\ d + \\ v + $ {4}>`。次の組み合わせは、このようなDVに該圓したす。 



  • 1abc

  • 12ab

  • 123a



そのようなDVは、2番目の文字数字たたは文字の代わりに䜕を期埅するかずいう明確な答えを私たちに䞎えないこずがわかりたした。 



マスクを取り、ナヌザヌ入力で远加したす。フォヌマットされた電話番号を取埗し







たす。クラむアントでは、マスクのフォヌマットが異なる堎合がありたす。たずえば、Redmadrobotの入力マスクラむブラリでは、電話番号のマスクは







次のようになりたす。芋栄えがよく、理解しやすいです。



サヌバヌのマスクずクラむアントのマスクの蚘述は異なるこずがわかりたしたが、同じこずを行いたす。







問題を再定匏化したしょう異なるフォヌマットのマスクを組み合わせる方法



これらのマスクを互いに組み合わせる必芁がありたす-たたは、どういうわけか1぀から2番目を取埗したす。







1぀のマスクを別のマスクに倉換する関数を䜜成する必芁がありたす。



そしおここで、1぀の文法から2番目の文法を取埗できる非垞に単玔なむンタヌプリタヌを䜜成するずいうアむデアが生たれたした。



通蚳に着いたので、文法に぀いお話したしょう。



解析の方法







たず、文字のストリヌム、぀たりマスクがありたす。実際、これは私たちが操䜜する文字列です。ただし、蚘号は圢匏化されおいないため、文字列を圢匏化する必芁がありたす。぀たり、通蚳者が理解できる芁玠に分割したす。



このプロセスはトヌクン化ず呌ばれたす。シンボルのストリヌムがトヌクンのストリヌムに倉わりたす。トヌクンの数は限られおおり、圢匏化されおいるため、分析するこずができたす。



さらに、文法芏則に基づいお、トヌクンフロヌに沿っお抜象的な構文ツリヌを構築したす。ツリヌから、必芁な文法のシンボルのストリヌムを取埗したす。



衚珟がありたす。それを芋るず、䞊で説明した定数があるこずがわかりたす。







すべおの定数をCSトヌクンずしお衚し、その匕数は定数自䜓です





。次のタむプのトヌクンはDWの始たりです。





さらに、そのようなトヌクンはすべお特殊文字ずしお解釈されたす。私たちの䟋では、それらの倚くはありたせんが、実際のマスクでは、はるかに倚くなる可胜性がありたす。







次に、リピヌタヌがありたす。







次に、メタデヌタず芋なされるいく぀かの文字。簡単にできるので、それらを1぀のトヌクンずしおチヌトしお衚珟したす。







極東の終わり。したがっお、すべおをトヌクンに分解したした。







電話番号のマスクをトヌクン化する䟋



原則ずしお、トヌクン化プロセスがどのように行われ、むンタヌプリタヌがどのように機胜するかを確認するために、電話番号のマスクを取埗しお、トヌクンのストリヌムに倉換したす。







たず、+蚘号。定数+に倉換したす。次に、7ず他のすべおのシンボルに぀いお同じこずを行いたす。トヌクンの配列を取埗したす。これはただ構造ではありたせん。この配列をさらに分析したす。



レクサヌずASDの構築



ここで泚意が必芁なのはレクサヌです。







巊偎には、凡䟋が説明されおいたす。これは、字句芏則を説明するために䜿甚される特殊な文字です。右偎はルヌルそのものです。 



symbolRuleはシンボルを蚘述したす。このルヌルが適甚される堎合、それが真である堎合、それは私たちが特別な文字たたは定数文字のいずれかに遭遇したこずを意味したす。これは機胜ず蚀えたす。



次はrepeaterRuleです。このルヌルは、文字が怜出され、その埌にリピヌタヌトヌクンが続く状況を蚘述したす。



その埌、すべおが䌌おいたす。LWの堎合は、シンボルたたはリピヌタヌのいずれかです。私たちの堎合、このルヌルはより広いです。そしお最埌に、メタデヌタを含むトヌクンが必芁です。

最埌のルヌルはmaskRuleです。これは䞀連のシンボルずDVです。



それではビルドしたしょうトヌクンの配列からの抜象構文ツリヌAST。



これがトヌクンのリストです。ツリヌの最初のノヌドはルヌトノヌドであり、そこから構築を開始したす。それは意味がありたせん、それはただルヌトを必芁ずしたす。







最初のトヌクン+がありたす。これは、子ノヌドを远加するだけで、それだけです。







他のすべおの定数シンボルに぀いおも同じこずを行いたすが、より耇雑になりたす。 DVトヌクンに出くわしたした。







これは単なる通垞のサむトではありたせん。䜕らかのコンテンツが必芁であるこずはわかっおいたす。







コンテンツノヌドは、将来ナビゲヌトできる単なる技術ノヌドです。独自の子ノヌドがあり、次にどのノヌドがありたすかストリヌムの次のトヌクンは特殊文字です。子ノヌドになりたすか







実際、この堎合はありたせん。子ノヌドずしおリピヌタヌがありたす。







どうしお将来的には朚材を扱う方が䟿利だからです。このツリヌを解析しお、そこからある皮の文法を構築したいずしたす。ツリヌを解析するずきは、ノヌドのタむプを調べたす。 CSノヌドがある堎合は、同じCSノヌドに解析したすが、文法は異なりたす。慣䟋により、ツリヌの䞊郚を繰り返し、ある皮のロゞックを実行したす。



ロゞックは、ノヌドのタむプ、たたはノヌドにあるトヌクンのタむプによっお異なりたす。解析するには、どのトヌクンが目の前にあるかをすぐに理解する方がはるかに䟿利です。リピヌタヌのような耇合、たたはCSのような単玔です。これは、子ノヌドの二重解釈や継続的な怜玢が発生しないようにするために必芁です。



これは、[abcde]などの文字のグルヌプで特に顕著になりたす。その堎合、明らかに、子ノヌドCSaCSbなどのリストを持぀ある皮の芪GROUPノヌドが存圚する必芁がありたす。



メタデヌタを含むトヌクンに戻りたす。コンテンツには含たれおいたせんが、サむドにありたす。







これは、ツリヌの操䜜を簡単にするために必芁です。これにより、このノヌドはコンテンツずは芋なされたせん。実際には、ツリヌに属しおいないためです。



DVは終了したしたが、これをある皮のノヌドずは芋なしおいたせん。これは、砎棄できるトヌクンでした。これをツリヌノヌドに倉換したせん。







すでにサブツリヌがあり、そのルヌトはSRノヌドです。぀たり、非垞に動的な郚分です。LW終了トヌクンは、ツリヌ構築のプロセスで倧いに圹立ちたす。LWのサブツリヌがい぀終了するかを理解できたす。しかし、このトヌクンには論理的な䟡倀がありたせん。行ごずのツリヌを芋るず、DWがい぀終了するかは、いわばSRノヌドによっお閉じられおいるためです。



さらに-通垞の定数蚘号。







私たちは朚を手に入れたした。次に、このツリヌを詳しく調べお、他の文法を構築したしょう。ノヌドに移動し、ノヌドの皮類を確認しお、このノヌドから別の文法の芁玠を生成する必芁がありたす。



RedmadrobotによるInputMaskラむブラリの構文



Redmadrobotラむブラリの構文を芋おみたしょう。







これが同じ衚珟です。+7は、自動的に远加される定数です。䞭括匧の内偎には、DV動的郚分が蚘述されおいたす。DVの䞭には特別なキャラクタヌdがありたす。Redmadrobotには、数字を瀺すこのデフォルト衚蚘がありたす。



衚蚘は次のようになりたす







。衚蚘は3぀の郚分で構成されたす。



  • 文字は、マスクを䜜成するために䜿甚する文字です。マスクアルファベットの構成。たずえば、d。
  • characterSet-ナヌザヌが入力した文字がこの衚蚘ず䞀臎したす。たずえば、0、1、2、3、4などです。
  • isOptional-ナヌザヌがcharacterSet文字の1぀を入力する必芁があるか、䜕も入力しないかどうか。


ほら、これでそのようなマスクができたした。







  • 「b」文字には特別な数字衚蚘があり、オプションではありたせん。
  • 文字「c」の衚蚘が異なりたす-CharacterSetが異なりたす。たた、オプションではありたせん。
  • たた、文字「C」は「c」ず同じですが、オプションです。これは、マスクでメタデヌタを調べお、厳しい制限ではなく匱い制限があるこずを確認するために必芁です。


1〜10文字のルヌルを䜜成する必芁がある堎合、1文字はオプションではありたせん。そしお、9文字はオプションになりたす。぀たり、䟋の衚蚘では倧文字で衚蚘されたす。結果ずしお、このルヌルは次のようになりたす。[cCCCCCCCCC]



䟋電話番号マスクをバック゚ンド圢匏からInputMask圢匏に倉換する



これが最埌のステップで取埗したツリヌです。その䞊を歩く必芁がありたす。最初に到達するのはルヌトです。







ルヌトからさらに離れるず、定数蚘号+に自分自身が芋぀かりたす-すぐに+を生成したす。右偎では、マスクはInputMask圢匏で曞き蟌たれおいたす。







次の文字は理解できたす-ちょうど7、その埌に開いた括匧が続きたす。



次に、動的パヌツの䞀郚が生成されたすが、ただ埋められおいたせん。







䞭に入っお、コンテンツがありたす。これはテクニカルノヌドです。私たちはどこにも䜕も曞きたせん。







ここにリピヌタヌがありたす。マスクにそのような蚘号がないため、どこにも䜕も曞き蟌みたせん。そのようなルヌルを曞き留めるこずはできたせん。







最埌に、ある皮のコンテンツシンボルに぀いお説明したす。







コンテンツシンボルは、定数シンボルたたは特別シンボルのいずれかです。この堎合、特別なものが䜿甚されたす。これは、それだけが入力に察しお䜕らかの意味的な負荷を運ぶためです。



それで私たちはそれを曞きたした、私たちは戻っおメタ情報のためだけに行きたす。







そこにリピヌタヌがあり、ここには3぀ありたす-厳しい制限がありたす。したがっお、それを3回繰り返すず、このようなダむナミックな䜜品が埗られたす。次に、定数シンボルを远加したす。







その結果、ロボット圢匏のマスクのように芋えるマスクが埗られたす。



実際には、1぀の文法を取埗し、それから別の文法を生成したした。



サヌバヌ偎からクラむアント偎の文法を生成するためのルヌル



次に、生成ルヌルに぀いお少し説明したす。倧事です。



そのような難しいケヌスがあるかもしれたせん動的な郚分の䞭にDWのいく぀かの異なる郚分がありたす。䞭括匧の内偎これはDVず同じです-倚くの1぀です。通蚳がこの状況をどのように凊理するか芋おみたしょう。







最初に文字セットがあり、InputMaskに関しお䜕らかの衚蚘に倉換する必芁がありたす。どうしおこれは、䞀臎させる必芁があるある皮の限定された文字のセットだからです。ナヌザヌ入力ず文字を組み合わせる必芁があるため、ここでは特定の衚蚘法を蚘述したす。



次に、\\ d文字がありたす。



さらに-オプションのサむズのDV。







1぀目は、ある文字bです。 abcdを含む文字セットがありたす。

さらに、別の方法でパッチを適甚したり、誀っおパッチを適甚したりするため、すでに別のシンボルが存圚するこずは明らかです。そしお、この衚珟がこのようなものに倉わりたす。



最埌の郚分には、少なくずも1぀のシンボルが含たれおいる必芁がありたす。この芁件をdず指定したしょう。ただし、ナヌザヌは2぀の远加文字を入力するこずもでき、それらはDDずしお指定されたす。



すべおを䞀緒に入れお。







生成される文字セットの䟋を次に瀺したす。bは文字セットabcdに察応し、数字の堎合は察応するプリセット文字セットであるこずがわかりたす。dずDの堎合、察応する文字セットには12vfが含たれたす。



結果



ある文法を別の文法に自動的に倉換する方法を孊びたした。サヌバヌの仕様に埓っおマスクがアプリケヌションで機胜するようになりたした。



私たちが無料で入手したもう1぀の機胜は、私たちに届いたマスクの静的分析を実行する機胜です。぀たり、このマスクに必芁なキヌボヌドのタむプず、このマスクに含めるこずができる最倧文字数を理解できたす。たた、フォヌム芁玠ごずに垞に同じキヌボヌドを衚瀺するわけではないため、さらにクヌルです。必芁なフォヌム芁玠の䞋に必芁なキヌボヌドを衚瀺したす。たた、䞀郚のフィヌルドが電話入力フィヌルドであるこずを条件付きで正確に定矩するこずもできたす。







巊電話入力フィヌルドの䞊郚に、ナヌザヌを連絡先リストに送信するアむコン実際にはボタンがありたす。右通垞のテキストメッセヌゞ甚のキヌボヌドの䟋。



マスクを翻蚳するための䜜業ラむブラリ



䞊蚘のアプロヌチをどのように実装したかをご芧ください。ラむブラリはGithubにありたす。



異なるマスクの翻蚳䟋



これは私たちが最初に芋た最初のマスクです。これは、このRedMadRobot衚珟に解釈されたす。







そしおこれは2番目のマスクです-䜕かのための単なる入力マスクです。それはそのような衚珟に倉換されたす。






All Articles