精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現“代碼可視化”需要了解的前置知識-編譯器前端

開發 前端
詞法分析又稱掃描(scanning),通過讀入組成源程序的字符流,將它們組織成為有意義的詞素(lexeme)的序列。詞素是源程序中的最小語言單位,如關鍵字、標識符、常數、操作符和分隔符等。對于每個詞素,詞法分析器將產生對應的詞法單元(token)作為輸出。

1. 前言

“代碼可視化”的概念定義和業界案例在前文中已經進行了講述,綜述可閱讀淺析“代碼可視化”,更多相關知識可查看專欄“代碼可視化”。本文梳理了“代碼可視化”功能開發需要前置了解的編譯器前端部分知識,因能力有限若有解釋不清和錯誤的地方敬請諒解,如果想更深入正規的學習相關知識可以查看文后擴展閱讀。

2. 編譯器(Compiler)

主要了解前端和中端相關理論知識,后端部分和目標機器代碼、特定機器架構相關一般很少用到可視化中。本文主要講述前端部分內容,中端部分后面再另寫文章。

圖片圖片


2.1 編譯器工作步驟

圖片圖片


2.2 編譯器前端

2.2.1 詞法分析(Lexical Analysis,or Scanning)

2.2.1.1 理論知識

詞法分析又稱掃描(scanning),通過讀入組成源程序的字符流,將它們組織成為有意義的詞素(lexeme)的序列。詞素是源程序中的最小語言單位,如關鍵字、標識符、常數、操作符和分隔符等。對于每個詞素,詞法分析器將產生對應的詞法單元(token)作為輸出。

token:<種別碼,屬性值>

圖片圖片


詞法分析器的核心邏輯基于有限自動機(Finite Automata),可以理解為有限個狀態的自動執行機器,用來將掃描得到的字符映射到有限個的可能性上。類型包括:

?不確定性有限自動機(NFA):在某狀態和輸入符號下可能存在多個可能的轉移狀態;

?確定性有限自動機(DFA):在任何狀態和輸入符號下都只有一個唯一的轉移狀態。

整個自動構造過程見下圖,大致了解一下即可,如果想深入學習各種算法細節可自行查閱資料。

圖片圖片


2.2.1.2 實踐一下

接下來我們練練手,使用Antlr對Java源碼進行詞法分析。Antlr是一個開源工具,支持根據規則文件生成詞法分析器和語法分析器,它自身是用 Java 實現的,Mac上可以使用Homebrew安裝或者直接使用idea插件antlr-v4。同時grammars-v4上提供了很多供參考的規則,我們這里也直接使用其中針對Java8定義的詞法分析規則練手。

?詞法規則定義:Java8Lexer.g4

# 截取內容
- 關鍵字定義
ABSTRACT     : 'abstract';
ASSERT       : 'assert';
BOOLEAN      : 'boolean';
BREAK        : 'break';
BYTE         : 'byte';
CASE         : 'case';
CATCH        : 'catch';
CHAR         : 'char';
...
- 字符串字面量定義
StringLiteral: '"' StringCharacters? '"';
fragment StringCharacters: StringCharacter+;
fragment StringCharacter: ~["\\\r\n] | EscapeSequence;
...

?待解析的Java代碼

public class HelloWorld { 
   public static void main(String[] args) { 
      System.out.println("Hello, World");
   }
}

?使用Antlr生成詞法分析器并執行分析操作

# ① 編譯詞法規則
antlr Java8Lexer.g4 
# ② 編譯上一步生成的java文件(注意需要把Antlr的JAR文件設置到CLASSPATH環境變量,否則會報錯)
javac Java8Lexer.java
# ③ 調用生成的詞法分析器獲取分析結果
grun Java8Lexer tokens -tokens ./examples/helloworld.java

圖片圖片

2.2.2 語法分析(Syntactic Analysis, or Parsing)

2.2.2.1 理論知識

語法分析又稱解析(parsing),它在詞法分析后執行。它將tokens組織成語法結構,通常是一棵抽象語法樹(Abstract Syntax Tree, AST),這棵樹表示了源代碼的語法結構。語法分析器需要根據一組預定義的語法規則來分析詞法單元序列。這些規則通常以上下文無關文法(Context-Free Grammar, CFG)的形式定義,其中每個規則定義了語言中的一個結構如何由其他結構組成。

圖片圖片


這里先簡單說一下CFG,如果想深入學習可以再查查資料。一個上下文無關文法由以下四個部分組成:

?非終結符(Non-terminals):這些是文法的變量,表示一組字符串的集合。它們通常用大寫字母表示,如A,B,Expr等;

?終結符(Terminals):這些是文法的基本符號,它們構成了語言的字符串。在編程語言中,終結符可以是關鍵字、操作符、標識符等。它們通常用小寫字母、數字或其他符號表示;

?產生式規則(Production rules):這些規則定義了非終結符如何被終結符或其他非終結符的序列替換。規則的形式通常是A → B C,表示非終結符A可以被B C替換;

?開始符號(Start symbol):這是一個特殊的非終結符,用于表示整個語言或文法的起始點。

-----舉個栗子-------
S → a S b
S → ε
-------解釋--------
·非終結符是S。
·終結符是a和b。
·產生式規則有兩條:S → a S b 表示 S 可以被 a S b 替換,S → ε 表示 S 可以被空字符串替換(ε 表示空字符串)。
·開始符號是S。
這個文法生成的語言是所有a和b的平衡字符串,例如:ab、aabb、aaabbb 等。

語法分析的核心能力是給定文法G和句子s,回答s是否能夠從G推導出來。實現的方式可以大致分為自底向上和自頂向下的語法分析:

?自頂向下語法分析:從樹的頂部(即開始符號)開始構建解析樹的過程。在這種方法中,解析器嘗試找出輸入字符串可以從哪個產生式開始,并逐步展開這些產生式,直到獲得完整的輸入字符串。自頂向下解析的特點是直觀、易于實現,尤其是對于簡單的文法。然而,它們可能無法處理左遞歸文法,且對于復雜的文法可能不夠高效。常見的算法有“遞歸下降解析”和“LL解析”,算法的詳細過程這里就不分析了,大家可以查查資料或者問一下GPT。

?自底向上語法分析:從樹的底部(即輸入字符串)開始構建解析樹的過程。在這種方法中,解析器嘗試找出輸入字符串的哪些部分可以對應文法的某個產生式的右側,并將其規約為產生式的左側,逐步減少整體的長度,直到最終規約為開始符號。自底向上解析通常比自頂向下解析更強大,因為它們可以處理更復雜的文法,包括那些自頂向下解析器無法處理的文法。然而,它們的解析表通常更為復雜,且實現起來可能更為困難。常見的算法有“LR解析”。

2.2.2.2 實踐一下

了解了基本概念后我們還是練練手,使用Antlr對Java源碼進行語法分析。這次就不使用grammars-v4中定義的語法規則了,因為編程語言的語法規則比較復雜最后生成的AST可讀性比較差。

?語法規則定義(詞法規則定義:CommonLexer.g4;語法規則定義:PlayScript.g4。)

grammar PlayScript;
import CommonLexer;   //導入詞法定義


/*下面的內容加到所生成的Java源文件的頭部,如包名稱,import語句等。*/
@header {
package antlrtest;
}


expression
    :   assignmentExpression
    |   expression ',' assignmentExpression
    ;


assignmentExpression
    :   additiveExpression
    |   Identifier assignmentOperator additiveExpression
    ;


assignmentOperator
    :   '='
    |   '*='
    |  '/='
    |   '%='
    |   '+='
    |   '-='
    ;


additiveExpression
    :   multiplicativeExpression
    |   additiveExpression '+' multiplicativeExpression
    |   additiveExpression '-' multiplicativeExpression
    ;


multiplicativeExpression
    :   primaryExpression
    |   multiplicativeExpression '*' primaryExpression
    |   multiplicativeExpression '/' primaryExpression
    |   multiplicativeExpression '%' primaryExpression
    ;

?使用Antlr生成語法分析器并執行分析操作

# ① 編譯語法規則
antlr PlayScript.g4
# ② 編譯上一步生成的java文件(注意需要把Antlr的JAR文件設置到CLASSPATH環境變量,否則會報錯)
javac *.java
# ③ 調用生成的語法分析器獲取分析結果(輸入表達式后使用^D觸發AST圖生成)
grun antlrtest.PlayScript expression -gui
age + 10 * 2 + 10
^D

圖片圖片


2.2.3 語義分析(Semantic Analyzer)

2.2.3.1 理論知識

語義分析(semantic analyzer)使用語法樹和符號表中的信息來檢查源程序是否和語言定義的語義一致。它同時也收集類型信息,并把這些信息存放在語法樹或符號表中,以便在隨后的中間代碼生成過程中使用。語義規則一般包括但不限于:

?類型檢查:確保操作數的類型與操作符兼容,例如不允許將整數賦值給字符串類型的變量;

?變量綁定:確保變量和函數的聲明與使用匹配,變量在使用前已被聲明,函數調用時參數的數量和類型與聲明相符;

?控制流檢查:確保程序中的控制流語句(如循環和條件語句)的使用是合法的;

?唯一性檢查:確保標識符的聲明在同一作用域內是唯一的,例如不允許在同一作用域內聲明兩個相同名稱的變量;

?權限和可訪問性檢查:確保對變量和函數的訪問符合其聲明的權限,例如私有成員只能在其類內部被訪問。

由于每種語言都有其獨特的語義規則和特性,例如類型系統、作用域規則、合法的操作符重載等都是語言特定的。因此,語義分析必須針對每種語言的規范來設計。

2.2.3.2 實踐一下

由于不同語言的語義分析實現差異較大,沒有通用的語義分析器生成工具。因此我們直接來閱讀一下Java編譯器中的相關源碼,了解一下實現邏輯。
javac中語義分析的源碼位于com.sun.tools.javac.code和com.sun.tools.javac.comp包中。

圖片圖片

以下列舉了一些語義分析的類,源碼就不貼了,可以在langtools下載閱讀:

?Symbol:表示所有的語言符號,包括變量、方法、類等。這些符號在編譯過程中被創建并填充到符號表中;

?Scope:用于管理作用域,它保存了一個作用域內所有的符號。這對于解析變量名和方法名非常重要,以確保它們在當前上下文中是可見的和有效的;

?Type:代表Java語言中的所有類型,包括基本類型、類和接口類型、數組類型等。javac在類型檢查過程中使用這個類來確定類型兼容性和執行類型轉換;

?Attr:進行屬性分析的核心類,它負責將類型信息和其他屬性關聯到語法樹的節點上。它執行類型檢查、方法解析和變量捕獲等任務;

?Check:用于執行各種語義檢查,例如檢查類型是否存在循環繼承,或者一個類是否實現了其接口的所有方法;

?Resolve:用于解析方法調用、類型名和變量名。它在符號表中查找正確的符號,并處理如方法重載解析等復雜情況;

?Annotate:處理注解相關的語義分析,包括注解的解析和應用;

?Types:提供了一組用于類型操作的實用方法,如確定一個類型是否可以賦值給另一個類型,或者查找最近公共祖先類型等;

?Flow: 負責進行控制流分析,比如檢查變量在使用前是否已經被賦值,或者方法是否總是有返回值;

?LambdaToMethod:Java 8 引入了 Lambda 表達式,這個類負責將 Lambda 表達式轉換為匿名類或靜態方法;

?TransTypesLower: 這些類負責某些類型轉換,包括泛型的橋接方法和自動裝箱/拆箱。

責任編輯:武曉燕 來源: 京東云開發者
相關推薦

2021-07-06 14:56:20

深度學習編程人工智能

2022-09-14 10:00:12

前端自動化測試

2017-06-26 15:32:59

前端編譯原理語言知識

2022-03-28 10:25:27

前端文件編譯器

2012-04-01 09:10:17

WEB設計師前端

2020-04-23 11:03:09

前端語言開發

2019-03-31 23:16:44

網絡前端協議

2011-08-24 14:22:13

LUA編輯器

2022-12-07 10:44:52

2022-10-26 07:21:15

網絡視頻開發

2020-12-09 09:30:57

前端開發技術

2017-10-14 13:54:26

數據可視化數據信息可視化

2011-04-01 11:16:06

hessian

2012-06-26 10:13:55

2022-11-24 13:05:27

ClangiOS

2024-06-14 16:07:41

2012-06-27 09:11:47

2010-03-18 13:48:14

Linux新手

2023-12-15 08:07:37

響應式布局官網

2017-10-12 18:42:08

前端HTML5基礎知識
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品精华液2区45| 99xxxx成人网| 精品久久久久久综合日本欧美| 国产欧美精品aaaaaa片| 久久视频www| 国产精品一级在线| 日本久久精品视频| 91 在线视频| 亚洲天堂日韩在线| 欧美一区二区三区的| 日本久久久精品视频| 麻豆tv在线| www精品美女久久久tv| 亚洲a中文字幕| 亚洲天堂男人av| 伊人久久大香线蕉av超碰演员| 一区二区三区视频观看| xfplay5566色资源网站| 亚洲狼人综合| 91成人网在线| 九一国产精品视频| av毛片在线免费| 国产清纯在线一区二区www| 国产精品久久精品国产| 国产一区二区麻豆| 久久久久久久高潮| 91地址最新发布| 麻豆亚洲av成人无码久久精品| 日韩免费高清| 亚洲天堂成人在线视频| 污片免费在线观看| 99精品在免费线中文字幕网站一区 | 性久久久久久久久久| 日韩精品免费视频一区二区三区| 欧美亚洲综合久久| 国产一区二区视频免费在线观看| hd国产人妖ts另类视频| 一区二区三区精品在线| 色爽爽爽爽爽爽爽爽| 在线免费观看黄色av| 久久久不卡网国产精品一区| 精品免费二区三区三区高中清不卡 | 鲁鲁狠狠狠7777一区二区| 黄色一级大片在线免费看国产一| 国产精品一卡二卡在线观看| 96国产粉嫩美女| 国产人妖一区二区三区| 狠狠色狠狠色综合日日91app| 国产精品久久久久久久久久免费| 无码任你躁久久久久久久| 日韩亚洲在线| 久久人人爽人人爽人人片av高清| 妺妺窝人体色www聚色窝仙踪| 夜间精品视频| 欧美国产日韩一区| 久久久久久久久99| 亚洲国产一区二区三区高清| 久久久久久av| 亚洲成人精品综合在线| 国产亚洲精品bt天堂精选| 久久综合一区二区三区| 性xxxx视频| 91看片淫黄大片一级在线观看| 精品一区二区国产| 久久这里精品| 国产精品情趣视频| 天天综合五月天| 搞黄网站在线看| 欧美视频第一页| 91国产精品视频在线观看| 国内精品伊人| 日韩欧美专区在线| 女性生殖扒开酷刑vk| 色综合久久中文| 国产亚洲精品久久久久久| 激情无码人妻又粗又大| 欧美人成在线| 欧美亚洲成人免费| 中日韩av在线| 国产成人福利片| 蜜桃久久精品乱码一区二区 | 国产在线国偷精品产拍免费yy| 成人在线精品视频| 老熟妇高潮一区二区高清视频| 91在线码无精品| 亚洲国产成人不卡| 午夜激情在线| 色狠狠色噜噜噜综合网| www.偷拍.com| 少妇一区二区三区| 久久精品成人欧美大片| 免费日韩一级片| 久久久综合网| 7777奇米亚洲综合久久| 你懂得在线网址| 亚洲欧美色图小说| 无码人妻丰满熟妇区毛片18| 高清不卡一区| 亚洲欧美日韩图片| 欧美性猛交xxxxx少妇| 性色一区二区| 99九九视频| 99re在线视频| 精品国产91久久久| 两性午夜免费视频| 视频一区在线观看| 久久久免费精品| 一区二区视频网| 97精品电影院| 中文精品无码中文字幕无码专区| 日韩成人av电影| 亚洲成人动漫在线播放| 欧美h片在线观看| 久久三级福利| 国产伦精品一区二区三区高清版 | 国产a级免费视频| 欧美国产激情二区三区| 浮妇高潮喷白浆视频| 国产精品一区二区三区www| 国产亚洲福利一区| 国产成人在线免费视频| 国产91精品入口| 免费观看黄色大片| 97欧美成人| 亚洲区免费影片| 在线能看的av| 99久久久久免费精品国产 | 噜噜噜在线观看免费视频日韩| 999在线观看免费大全电视剧| 91.xxx.高清在线| 欧美在线免费观看亚洲| 波多野结衣一本| 99精品视频免费观看视频| 亚洲自拍偷拍区| 黄色一级大片在线免费看产| 在线观看国产日韩| 欧美黄色一级生活片| 欧美一级专区| 久久影视中文粉嫩av| 96av在线| 精品一区二区亚洲| 无码任你躁久久久久久久| 久久网站最新地址| www黄色av| 国产精品免费99久久久| 国产精品久久久亚洲| 你懂的免费在线观看| 91久久精品一区二区三区| 国产熟妇久久777777| 天堂精品中文字幕在线| 日韩精品欧美专区| 69堂精品视频在线播放| 色七七影院综合| 国产又粗又猛又黄| 1024成人网| 波多野结衣电影免费观看| 欧美日本中文| 精品乱子伦一区二区三区| 中文在线中文资源| 夜夜嗨av一区二区三区免费区 | 亚洲日本japanese丝袜| 日本午夜精品久久久久| 久久久91精品国产一区不卡| 精品毛片在线观看| 精品欧美激情精品一区| 中文字幕国产综合| 美女国产一区二区三区| 干日本少妇视频| 国内精品国产成人国产三级粉色| 欧美在线不卡区| 91官网在线| 日韩欧美精品在线视频| 99热在线观看免费精品| 久久九九久久九九| 999热精品视频| 在线视频精品| 亚洲欧洲精品一区二区| 中文字幕亚洲在线观看| 欧美在线激情网| 99se视频在线观看| 精品1区2区在线观看| 精品不卡一区二区| 亚洲人妖av一区二区| 亚洲少妇18p| 日本不卡视频在线观看| 18禁裸男晨勃露j毛免费观看| 天堂99x99es久久精品免费| 91精品美女在线| 国产粉嫩在线观看| 日日骚av一区| 天堂av电影在线观看| 色婷婷久久99综合精品jk白丝| 成年人二级毛片| 久久久国际精品| av在线天堂网| 三级一区在线视频先锋| 成人在线视频一区二区三区| 欧州一区二区| 国产一区二区在线观看免费播放| 国产精品黄色片| 97涩涩爰在线观看亚洲| 黄色网在线免费看| 国产午夜精品视频免费不卡69堂| 精品人妻午夜一区二区三区四区| 一本大道久久精品懂色aⅴ| 岛国毛片在线观看| 中文字幕第一区二区| 大乳护士喂奶hd| 国产精品99久久久久久宅男| 精品久久久久久久无码| 亚洲激情亚洲| 日本aa在线观看| 色小子综合网| 日韩一区国产在线观看| 欧洲亚洲成人| 国产高清在线一区| 日本一区二区三区电影免费观看 | 131美女爱做视频| 综合av在线| 一区二区不卡在线观看| 亚洲激情77| 久久精品二区| 国内自拍欧美| 国产伦精品一区二区三区| 日韩视频一区二区三区四区| 国产中文字幕91| 成人涩涩视频| 国产精品国产自产拍高清av水多| 日韩脚交footjobhd| 久久久久久午夜| 波多野结衣在线播放| 九九久久精品一区| 国产cdts系列另类在线观看| 久久精品国产一区二区电影| 日本美女在线中文版| 在线视频日本亚洲性| 第九色区av在线| 一区二区三区高清国产| www.在线视频.com| 在线看日韩欧美| 在线免费观看黄色| 日韩综合视频在线观看| 日本三级在线视频| 久久天天躁狠狠躁夜夜躁| 麻豆视频在线免费观看| 成人97在线观看视频| wwwav在线| 欧美激情视频在线观看| 国模私拍视频在线播放| 国自产精品手机在线观看视频| 爱看av在线| 国产91对白在线播放| 国产超碰精品| 国产欧美精品日韩| 国产色99精品9i| 成人午夜电影在线播放| 久久综合社区| 欧美1o一11sex性hdhd| 国产欧美日韩在线观看视频| 亚洲自拍三区| 午夜精品999| 自慰无码一区二区三区| 日日骚欧美日韩| 亚洲天堂av一区二区| 国产高清无密码一区二区三区| 深田咏美中文字幕| 久久色成人在线| 娇小11一12╳yⅹ╳毛片| 亚洲精品美腿丝袜| 精品91久久久| 欧美日本视频在线| 国产高清免费av| 亚洲国产欧美一区二区三区久久| 久蕉在线视频| 久久国产精品影片| 亚洲性色av| 成人免费视频网| 久久九九热re6这里有精品| 天堂社区 天堂综合网 天堂资源最新版 | 精品国内片67194| 久香视频在线观看| 欧美精品免费在线| 在线日韩影院| 亚洲影院在线看| 蜜臀91精品国产高清在线观看| 亚洲一区二区三区精品在线观看| 国产尤物精品| 免费看国产黄色片| 成人毛片在线观看| 天天操天天摸天天舔| 亚洲成人福利片| 国产精品久久久久久久成人午夜| 亚洲成人亚洲激情| 欧美性videos| 欧美中文字幕在线| 亚洲精品一区国产| 手机成人在线| 亚洲日韩成人| 91蝌蚪视频在线| 久久久久久久网| 国产精品99精品无码视| 欧美日韩中文字幕一区| 亚洲日本在线播放| 欧美精品做受xxx性少妇| 素人啪啪色综合| 欧美1o一11sex性hdhd| 激情国产一区| 熟妇无码乱子成人精品| 中文幕一区二区三区久久蜜桃| 久久久午夜影院| 欧美一二三四区在线| 一区二区三区视频在线观看视频| 68精品久久久久久欧美| 亚洲性视频在线| 日韩人妻一区二区三区蜜桃视频| 免费黄网站欧美| 我和岳m愉情xxxⅹ视频| 亚洲aⅴ怡春院| 成人免费视频国产免费麻豆| 久久精品国产一区二区三区| 99精品在免费线偷拍| 欧美日韩系列| 国产精品久久久免费 | 国产精品一二三四五区| 国产一区二区三区四区福利| 欧美二三四区| 欧美大香线蕉线伊人久久| 尤物精品在线| 日本精品一二三| 一区二区三区在线视频免费| 国产精品免费无遮挡| 日韩中文字幕在线看| 国产精品久久久久久久久久齐齐| 久久视频在线观看中文字幕| 亚洲乱亚洲高清| 玖草视频在线观看| 精品国产福利在线| 亚洲色欧美另类| 欧美专区在线视频| 神马电影久久| 手机在线免费观看毛片| 亚洲国产成人在线| 中文字幕无码乱码人妻日韩精品| 亚洲一级片在线看| 欧美影视资讯| 亚洲一区二区精品在线| 久久国产福利国产秒拍| 伊人久久久久久久久久久久久久| 欧美顶级少妇做爰| 制服丝袜在线播放| 成人在线观看91| 国产日韩欧美一区在线| 国产交换配乱淫视频免费| 日本久久电影网| 91在线品视觉盛宴免费| 91精品久久久久久久| 一区二区国产在线| 丰满岳乱妇一区二区| 欧美性猛交xxxx久久久| av在线播放免费| 91亚洲国产精品| 亚洲午夜久久久久久尤物| 亚洲成人av免费在线观看| 色婷婷精品大在线视频| 毛片在线看片| 国产精品免费一区二区三区在线观看| 亚洲欧洲另类| 久久精品三级视频| 91精品国产综合久久精品| 国产在线美女| 亚洲精品一卡二卡三卡四卡| 国产麻豆午夜三级精品| 六月丁香在线视频| 色噜噜亚洲精品中文字幕| 99久久人爽人人添人人澡 | 亚洲第一精品在线观看| 中文一区二区视频| 亚洲国产欧美在线观看| 欧美在线观看www| 国产精品久久久久久久久久久免费看 | 国产专区在线视频| 久久久久久久精| 国产jzjzjz丝袜老师水多| 全亚洲最色的网站在线观看| 久久中文字幕av| 国产真实乱人偷精品| 欧美欧美午夜aⅴ在线观看| 欧美男男video| 日日夜夜精品网站| 成人久久18免费网站麻豆| 午夜精品久久久久久久蜜桃| 欧美成人精品一区| 欧美精品一二| 国产在线不卡av| 欧美日韩一区二区三区免费看| 国产99re66在线视频| 伊人久久av导航| 久久久三级国产网站| 成人1区2区3区| 91精品视频免费看|