国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
プロカルク2000
1 つには何が入っていますか?
トークナイザー
パーサー
評(píng)価者
コードを見せてください?
以上です
演算子の優(yōu)先順位
続きを読む
ホームページ バックエンド開発 PHPチュートリアル 1 時(shí)間の表現(xiàn)言語(yǔ)

1 時(shí)間の表現(xiàn)言語(yǔ)

Jan 21, 2025 am 08:16 AM

The One Hour Expression Language

このブログ投稿は、元の形式で表示するのが最適です。

この投稿は、1 時(shí)間の式言語(yǔ) というタイトルのプレゼンテーションを要約し、概念とコードの両方をレビューします。1

式言語(yǔ)2は、このコンテキストでは、式 (バイトのシーケンス、おそらく UTF-8 文字) を評(píng)価します。3 例は次のとおりです。

  • 1 1
  • //article[@title="foobar"]//image
  • .items[].foo|select(.bar = "foo")
  • a.comments > 1 and a.category not in ["misc"]

式言語(yǔ) (または DSL4) の例は次のとおりです:

  • JQ
  • Kibana クエリ言語(yǔ)
  • XPath 言語(yǔ)
  • Symfony 式言語(yǔ)

なぜ獨(dú)自の表現(xiàn)言語(yǔ)を構(gòu)築するのでしょうか? なぜだめですか? 忙しすぎますか? 心配しないで!數(shù)か月、數(shù)週間、さらには數(shù)日も必要ありません。 One Hour Expression Language を使用して 1 時(shí)間で 1 つ作成しましょう!5

プロカルク2000

私たちは、2000 年以降に向けた次世代の非科學(xué)算術(shù)計(jì)算機(jī)である ProCalc2000 式言語(yǔ)を構(gòu)築します。

1 11 2 などの式を評(píng)価し、1 3 2 / 2 などの除算問(wèn)題を処理できます。

ゴジラ ゴジラは浮動(dòng)小數(shù)點(diǎn)數(shù)による割り算を嫌います。

言語(yǔ)は數(shù)字 (例: 1、2) と演算子 (、、-、) で構(gòu)成されます。 演算子の優(yōu)先順位 (付録 I を參照) や除算は*サポートされません。

そのシンプルさにもかかわらず、変數(shù)、関數(shù)、パイプ演算子、サフィックス、文字列の連結(jié)、さらには (ゴジラの希望に反して) 除算などの機(jī)能を追加するための基盤を提供します。

1 つには何が入っていますか?

バイト シーケンスを評(píng)価するには多くの方法がありますが、ここではトークナイザー、パーサー、およびエバリュエーターを使用します。

<code>              +-----------+  tokens  +--------+  ast  +-----------+ 
EXPRESSION ==>| Tokenizer |--------->| Parser |------>| Evaluator | => VALUE
              +-----------+          +--------+       +-----------+</code>

トークナイザー

レクサーまたはスキャナーとも呼ばれます。このクラスは、文字列をトークンと呼ばれる分類されたチャンクに分割します。

class Tokenizer
{
    public function tokenize(string $expression): Tokens
    {
        // ...
    }
}

たとえば、1 2 3 は 5 つのトークンを生成します。

<code>Token(Integer, 1)
Token(Plus)
Token(Integer, 2)
Token(Plus)
Token(Integer, 3)</code>

トークナイザーは左から右にスキャンして、興味深いチャンク (正の整數(shù)、 、 - 、および * 演算子) を識(shí)別します??瞻驻蠠o(wú)視されます。他の文字を使用するとエラーが発生します。 トークンのタイプは、整數(shù)、プラス、マイナス、乗算です。

ゴジラ Godzilla はトークナイザーとスタック マシンを提案しますが、Godzilla が気にするのでパーサーと評(píng)価器を使用します。

トークナイザーは式の有効性をチェックしません。チャンクを分類するだけです。6 トークンはパーサーに渡されます。

パーサー

パーサーはトークンを解釈し、抽象構(gòu)文ツリー (AST) に変換します。

<code>              +-----------+  tokens  +--------+  ast  +-----------+ 
EXPRESSION ==>| Tokenizer |--------->| Parser |------>| Evaluator | => VALUE
              +-----------+          +--------+       +-----------+</code>

トークン リストが與えられると、パーサーは AST (ツリーのルート ノード) を返します。 各ノードは評(píng)価可能な式です。ノード タイプは BinaryOp と Integer です。

二項(xiàng)演算には 2 つのオペランドがあります (たとえば、foo or barBinaryOp(Variable('foo'), 'or', Variable('bar')) である可能性があります)。

単項(xiàng)演算にはオペランドが 1 つあります (例: -1)。

三項(xiàng)演算には 3 つのオペランドがあります (例: foo ? bar : baz)。

1 1 / 5 は、演算子として を持つ BinaryOp で、一方のオペランドは 1 で、もう一方のオペランドは別の BinaryOp (1 / 5) です。

class Tokenizer
{
    public function tokenize(string $expression): Tokens
    {
        // ...
    }
}

評(píng)価者

エバリュエーターはノードを受け入れ、値 (ここでは整數(shù)) を返します。 木歩き通訳です

<code>Token(Integer, 1)
Token(Plus)
Token(Integer, 2)
Token(Plus)
Token(Integer, 3)</code>

コードを見せてください?

このコードは PHPSW ミートアップで誕生し、単體テストによって推進(jìn)されました (ここでは省略)。リポジトリを參照してください。

ゴジラ ゴジラはこのコードに怒って、リファクタリングを提案するでしょう。

トークナイザー

まず、Token 列挙型とオプションの値を持つ TokenType クラス:

class Parser
{
    public function parse(Tokens $tokens): Node
    {
        // ...
    }
}
<code>                        +-------------+
                        | Binary Op + | 



<p>In PHP:</p>

```php
$ast = new BinaryOp(
    left:     new Integer(1),
    operator: '+',
    right:    new BinaryOp(
        left:     new Integer(1),
        operator: '/',
        right:    new Integer(5),
    )
);</code>

トークンは次のようになります:

class Evaluator
{
    public function evaluate(Node $node): int
    {
        // ...
    }
}

Tokenizer クラスは次の作業(yè)を行います:7

class Token
{
    public function __construct(
        public TokenType $type,
        public ?string $value = null
    ) {}
}

Tokens コレクション:

enum TokenType
{
    case Plus;
    case Minus;
    case Multiply;
    case Integer;
}
ゴジラ Godzilla は、配列と `array_shift`、またはトークン化と解析を同時(shí)に行うためのジェネレーターを好みます。

パーサー

[
    new Token(TokenType::Integer, 50),
    new Token(TokenType::Plus),
    // ...
]

ここに、演算子の優(yōu)先順位、サフィックス解析、パイプ演算子が追加されます。 たとえば、サフィックス解析では、「5 マイル」のような表現(xiàn)を処理します。

評(píng)価者

class Tokenizer
{
    public function tokenize(string $expression): Tokens 
    {
        $offset = 0;
        $tokens = [];
        while (isset($expression[$offset])) {
            $char = $expression[$offset++];
            if (is_numeric($char)) {
                while (is_numeric($expression[$offset] ?? null)) {
                    $char .= $expression[$offset++];
                }
                $tokens[] = new Token(TokenType::Integer, $char);
                continue;
            }
            $token = match ($char) {
                '+' => new Token(TokenType::Plus),
                '-' => new Token(TokenType::Minus),
                '*' => new Token(TokenType::Multiply),
                ' ' => null,
                default => throw new RuntimeException(sprintf(
                    'Invalid operator: "%s"', $char
                )),
            };
            if ($token === null) {
                continue;
            }
            $tokens[] = $token;
        }
        return new Tokens($tokens);
    }
}

以上です

このコードは、テストを含めてライブコーディングされました。 完全なコードはリポジトリで入手できます。

演算子の優(yōu)先順位

1 * 3 4(1 * 3) 4 = 7 である必要がありますが、解析方法により、言語(yǔ)はそれを 1 * (3 4) = 7 として評(píng)価します。8 Pratt パーサーはこれを修正します。

<code>              +-----------+  tokens  +--------+  ast  +-----------+ 
EXPRESSION ==>| Tokenizer |--------->| Parser |------>| Evaluator | => VALUE
              +-----------+          +--------+       +-----------+</code>
ゴジラ ゴジラは再帰性を理解しています。

続きを読む

  • Crafting Interpreters: 書籍 (無(wú)料 Web 版付き) by Robert Nystrom
  • 式の解析が簡(jiǎn)単に: Robert Nystrom によるブログ投稿
  • スタック マシン RPN 計(jì)算機(jī): Igor Wiedler による 2014 年の投稿
  • ドクトリンレクサー
  • PHPStan Phpdoc パーサー9

  1. コードは反復(fù)ごとに変更されます。
  2. より具體的には、式言語(yǔ)インタープリタ。
  3. PHP では文字列と呼ばれることがよくあります。
  4. ドメイン固有の言語(yǔ)
  5. 特許は存在しません。
  6. トークナイザーは構(gòu)文の強(qiáng)調(diào)表示に役立ちます。
  7. preg_ メソッドの方がパフォーマンスが高い可能性があります。
  8. 異なる答えが期待されていた場(chǎng)合のみ、間違っています。
  9. ツリートラバーサルは、Doctrine のクエリビルダーを通じて発見されました。

以上が1 時(shí)間の表現(xiàn)言語(yǔ)の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPに認(rèn)証と承認(rèn)を?qū)g裝するにはどうすればよいですか? PHPに認(rèn)証と承認(rèn)を?qū)g裝するにはどうすればよいですか? Jun 20, 2025 am 01:03 AM

tosecurelyhandLeauthenticationAndauthorizationInizationInization、followTheSteps:1.LwayShashPasswordswithPassword_hash()andverifyusingpassword_verify()、usepreparedStatementStatementStatementStatementStatementStain、andstoreUserdatain $ _SessionAfterlogin.2.implementRementRementRementRementRementRementRementRole

PHPでファイルアップロードを安全に処理するにはどうすればよいですか? PHPでファイルアップロードを安全に処理するにはどうすればよいですか? Jun 19, 2025 am 01:05 AM

PHPでファイルアップロードを安全に処理するために、コアはファイルタイプを確認(rèn)し、ファイルの名前を変更し、権限を制限することです。 1。Finfo_File()を使用して実際のMIMEタイプを確認(rèn)し、Image/JPEGなどの特定のタイプのみが許可されます。 2。uniqid()を使用してランダムファイル名を生成し、非webルートディレクトリに保存します。 3. PHP.iniおよびHTMLフォームを介してファイルサイズを制限し、ディレクトリ権限を0755に設(shè)定します。 4. Clamavを使用してマルウェアをスキャンしてセキュリティを強(qiáng)化します。これらの手順は、セキュリティの脆弱性を効果的に防止し、ファイルのアップロードプロセスが安全で信頼性が高いことを確認(rèn)します。

PHPの==(ゆるい比較)と===(厳密な比較)の違いは何ですか? PHPの==(ゆるい比較)と===(厳密な比較)の違いは何ですか? Jun 19, 2025 am 01:07 AM

PHPでは、==と==の主な違いは、タイプチェックの厳格さです。 ==タイプ変換は比較の前に実行されます。たとえば、5 == "5"はtrueを返します。===リクエストは、trueが返される前に値とタイプが同じであることを要求します。たとえば、5 === "5"はfalseを返します。使用シナリオでは、===はより安全で、最初に使用する必要があります。==は、タイプ変換が必要な場(chǎng)合にのみ使用されます。

PHP(、 - 、 *、 /、%)で算術(shù)操作を?qū)g行するにはどうすればよいですか? PHP(、 - 、 *、 /、%)で算術(shù)操作を?qū)g行するにはどうすればよいですか? Jun 19, 2025 pm 05:13 PM

PHPで基本的な數(shù)學(xué)操作を使用する方法は次のとおりです。1。追加標(biāo)識(shí)は、整數(shù)と浮動(dòng)小數(shù)點(diǎn)數(shù)をサポートし、変數(shù)にも使用できます。文字列番號(hào)は自動(dòng)的に変換されますが、依存関係には推奨されません。 2。減算標(biāo)識(shí)の使用 - 標(biāo)識(shí)、変數(shù)は同じであり、タイプ変換も適用されます。 3.乗算サインは、數(shù)字や類似の文字列に適した標(biāo)識(shí)を使用します。 4.分割はゼロで割らないようにする必要がある分割 /標(biāo)識(shí)を使用し、結(jié)果は浮動(dòng)小數(shù)點(diǎn)數(shù)である可能性があることに注意してください。 5.モジュラス標(biāo)識(shí)を採(cǎi)取することは、奇妙な數(shù)と偶數(shù)を判斷するために使用でき、負(fù)の數(shù)を処理する場(chǎng)合、殘りの兆候は配當(dāng)と一致しています。これらの演算子を正しく使用するための鍵は、データ型が明確であり、境界の狀況がうまく処理されるようにすることです。

PHPのNOSQLデータベース(Mongodb、Redisなど)とどのように対話できますか? PHPのNOSQLデータベース(Mongodb、Redisなど)とどのように対話できますか? Jun 19, 2025 am 01:07 AM

はい、PHPは、特定の拡張機(jī)能またはライブラリを使用して、MongoDBやRedisなどのNOSQLデータベースと対話できます。まず、MongoDBPHPドライバー(PECLまたはComposerを介してインストール)を使用して、クライアントインスタンスを作成し、データベースとコレクションを操作し、挿入、クエリ、集約、その他の操作をサポートします。第二に、PredisライブラリまたはPhpredis拡張機(jī)能を使用してRedisに接続し、キー価値設(shè)定と取得を?qū)g行し、高性能シナリオにPhpredisを推奨しますが、Predisは迅速な展開に便利です。どちらも生産環(huán)境に適しており、十分に文書化されています。

最新のPHP開発とベストプラクティスを最新の狀態(tài)に保つにはどうすればよいですか? 最新のPHP開発とベストプラクティスを最新の狀態(tài)に保つにはどうすればよいですか? Jun 23, 2025 am 12:56 AM

postaycurrentwithpdevellyments andbest practices、follow keynewsourceslikephp.netandphpweekly、egagewithcommunitiessonforums andconferences、keeptooling and gradivallyadoptnewfeatures、andreadorcontributeTopensourceprijeprijeprijeptrijeprijeprests.

PHPとは何ですか、そしてなぜそれがWeb開発に使用されるのですか? PHPとは何ですか、そしてなぜそれがWeb開発に使用されるのですか? Jun 23, 2025 am 12:55 AM

PhpBecamepopularforwebdevelopmentduetoitseaseaseaseaseasease、SeamlessintegrationWithhtml、widespreadhostingsupport、andalargeecosystemincludingframeworkelavelandcmsplatformslikewordspresspressinsinsionsisionsisionsisionsisionsionsionsisionsionsionsisionsisions

PHPタイムゾーンを設(shè)定する方法は? PHPタイムゾーンを設(shè)定する方法は? Jun 25, 2025 am 01:00 AM

tosettherighttimezoneInphp、usedate_default_timezone_set()functionthestthestofyourscriptwithavalididentifiersiersuchas'america/new_york'.1.usedate_default_timezone_set()beforeanydate/timefunctions.2.2.Altertentally、confuturethephp.inifilebyset.

See all articles