This commit is contained in:
Tan, Kian-ting 2023-12-02 03:46:41 +08:00
parent 2c341f6b0b
commit b7905be518
393 changed files with 2526 additions and 39 deletions

View file

@ -1,2 +0,0 @@
# 定義抽象語法樹和語法

View file

@ -1 +0,0 @@
yoxem@yoxem-HP-Laptop-15-fd0072.6714:1700948777

View file

@ -0,0 +1,301 @@
# Ch1 定義抽象語法樹和語法
## 抽象語法樹
C語言、Python語言就算有許多的關鍵字、操作符、符號或是常數變數在編譯器分析語法以後最後會轉成編譯器可以操作的樹結構然後再轉成我們想要的另一個語言的樹最後輸出另一個語言的程式碼。
但是什麼叫做抽象語法樹呢?我們先從一點句法知識來談。
學過中學國文文法的課程,會背一堆類似「主詞+動詞+受詞」、「主詞+(有/無)+受詞」的結構。可以換個說法,是句子=「主詞+動詞+受詞」或是「主詞+(有/無)+賓詞」的形式。我們將「=」寫成「::=」,「/」(或是)寫成「|」,「動詞」擴充變成「動詞片語」,就變成:
```
句子 ::= (主詞 動詞片語 受詞) | (主詞 (有 | 無) 受詞)...
```
為了易讀所以寫成:
```
句子 ::= 主詞 動詞片語 受詞
| 主詞 (有 | 無) 受詞
| ...
```
用這種形式表示的語言句法叫做「BNF文法」。這種句法看起來很語言學但是我們想受詞和主詞可以為名詞、專有名詞或是「形容詞+名詞」;動詞片語可以為動詞或是「副詞+動詞」。因此這樣之規則,就可以生成許多句子,比如「我有筆」、「張三養貓」、「小芳慢慢移動檯燈」等等的句子。然後句子可以用上述規則,分析成語法的樹狀結構,如下圖把「我曾旅居新竹」寫成語法樹。
<figure markdown>
![「我曾旅居新竹」的語法樹](syntaxtree.svg "")
<figcaption>「我曾旅居新竹」的語法樹</figcaption>
</figure>
同理,程式語言通常也有更嚴謹的這樣生成文法,可以用幾個簡單規則生出繁多的程式碼,而且合乎語法規定。這種生成文法也可檢查輸入的程式碼有沒有符合句法的規定。而這種語法生成的程式碼,去掉不需要的逗號等等符號,當然也可以做成語法樹,就是抽象語法樹 (abstract syntax tree, AST),如下圖所示。
<figure markdown>
![「(2+2) == 4」的語法樹。注意括號已經刪除。](syntaxtree2.svg "")
<figcaption>「(2+2) == 4」的語法樹。注意括號已經刪除。</figcaption>
</figure>
而上文的抽象語法樹可以是我們把程式經過編譯器分析之後用「樹」儲存的資料結構。而樹形結構我們可以使用Lisp語言的S表達式(S-expressiom; S-exp)來表示,本文採用這樣的表示方法。所以上文的`(2+2)==4`即`(== (+ 2 2) 4)``let baz = foo("bar")`若是把foo("bar")這種函數套用(apply)寫成`(APPLY foo "bar")`則其S-exp語法樹可寫為`(let baz(APPLY foo "bar"))`。
## 決定語法
那我們要如何制定這個語言的語法這樣我們才能夠寫出符合這個語法的函數然後再用tokenizer和parser轉成AST樹。
不考慮` + - * /`這種運算子,以及向量的表示子,函數可以用`ID(arg1, arg2, ...)`這種方式來表示,其中`arg_x`是引數,`ID`是識別子identifier可以把它想成變函數的名字
變數可以是`ID``arg_n`可以是`ID`或常數(量)。
常數(量)的表示法可以是下列任一:
- 浮點數如0.0, 36.8BNF風格的表達法為`[0-9]+ '.' [0-9]+`。`'c'`指c這個文字`+`表示前面的重複1次以上`[0-9]`表示數字0到9。
- 整數如22、0`[0-9]+`
- 字串:`'"' (不是「"」的任一字元|('\' '"')) '"'``.`表示任何一個字元)
然而我們還是需要綁定變數`let x = var in boby`(在`body`裡面,`x`指代`var`)、`set x = var`改變變數值、lambda`lambda (x)=>{body}`。另外為了要區別要在PDF印上去的一般字元在這個檔案的常數、變數、函數、關鍵字等前後需要加@表示但是函數、lambda裡面的變數不用。比如`@foo(a, b)@`、`@lambda(x)@`、`@"IAmAString"@`、`@2.2@`、`@3@`後三者應該很少用到可是若需在PDF印`@`時怎辦?那就用`\@`。比如`foo\@example.com`。
所以我們可以定義以下的BNF風文法
```
Language ::= PrintTxt | Exprs
PrintTxt ::= (('\' '@')| 非@字元)+ //「我是一隻貓」或是「www\@example.com」
Exprs ::= @ Expr* @ // *表示前面的重複0次以上包含不出現
Expr ::= (Letting | Setting | Lambda | Apply | Var| Const) | "(" Expr ")"
Letting ::= "let" Var "=" Expr "in" Expr // let foo = 12 in ...
Setting ::= Var ":=" Expr "in" Expr // foo := a in ...
Lambda ::= "fn" Var "->" Expr // fn x -> 12
Apply ::= Expr Expr // foo 3 即foo(3)
Var ::= ID
Const ::= String | Float | Int
ID ::= ("_" | [a-z] | [A-Z]) ("_" | [0-9] | [a-z] | [A-Z])+
Integer ::= [0-9]+
Float ::= [0-9]+ "." [0-9]+
String ::= '"' (不是「"」的任一字元|('\' '"')) '"'
```
## 用ParserCombinator進行tokenize
Parser combinator分析器組合子是一種利用高階函數來簡化分析器撰寫的辦法。這講到頭來會涉及「遞歸下降分析」以及其他編譯理論的東西但太難了聽說可以讀編譯理論的「龍書我們可以製作一個小的tokenizer。但是因為自己寫parser combinator太累了所以我們就用nom來幫我們代勞。
」)。講一個簡單的案例吧:
假設我們想要將字串的開頭match 0~9 之中的其中一個我們可以寫一個函數match0to9如下
```
function match0to9(string){
if (string[0] in 0,1,..,9){
let rest = string[1:];
let matched = string[0];
return {type: "OK", rest : rest, matched : matched};
}
else{
return {type : "Nothing"};
}
}
```
假設我們要將字串`s`的前3個字的match 0~9呢如果會高階函數的話引入一個`then`函數,然後把`match0to9`傳進去,這樣寫起來比較簡潔,行數可以比較少:
```
function thenDo(input, fun){
if (input.type != "Nothing"{
middle = fun(input.rest);
if (middle.type != "Nothing"){
// add the matched character of input to the head of the result
middle.matched = input.matched + middle.matched
return middle;
}else{
return middle; // return nothing
}
}else{
input; // return nothing
}
}
// "s" should be wrapped in a object
let sWrapped = {type : "OK", rest : s, matched : ""};
// match0~9 3 times
thenDo(thenDo(thenDo(sWrapped, match0to9), match0to9), match0to9)
```
我們可以製作一個小的tokenizer。但是因為自己寫parser combinator太累了所以我們就用nom來幫我們代勞。
安裝nom可以用`cargo run nom`。
假設我們要match 0-9任意次以上就是integer我們可以這樣寫
```
// import all the parser unit for string
use nom::character::complete::*;
// for the return type
use nom::IResult;
// integer ::= [0-9]+
pub fn integer(input: &str) -> IResult<&str, &str> {
return digit1(input) ; // [0-9]+
}
// test parser
#[cfg(test)]
mod tests {
// import the functions ouside mod tests
use super::*;
// test integer
#[test]
fn test_integer() {
//if no error is shown, the function passes the test
assert_eq!(integer("12345"), Ok(("", "12345")));
assert_eq!(integer("0"), Ok(("", "0")));
}
}
```
用`cargo run`可以順利通過:
```
running 1 test
test tests::test_integer ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
```
我們做第二個tokenizer`float`
其中的`recognize`蒐集所有包在裡面的`parsers`的string。
```
// collect matched strings of all the parsers,
use nom::combinator::recognize;
// given 2 parser and gets the result as (1st_matched, 2nd_matched),
use nom::sequence::pair;
// exact matching characters
use nom::bytes::complete::tag;
// float ::= [0-9]+ "." [0-9]+
pub fn float(input: &str) -> IResult<&str, &str>{
// [0-9]+ "." [0-9]+
// "12.345" returns Ok((else, (("12", '.'), "345"))), then recgonize them as
// Ok("12.345")
let a =
recognize(pair(pair(digit1, tag(".")), digit1))(input);
return a;
}
```
parser `identifier`(引用的函數的名稱空間略)。使用`fold_may0`和新的空vector來儲存match多次的parser的符合結果
```
pub fn identifier(input : &str) -> IResult<&str, &str>{
return recognize(pair(
// 1st character is a-z, A-Z or _
satisfy(|c| (is_alphabetic(c as u8) || c == '_')),
// the tail characters (0+ times matched) storing in a vector
fold_many0(
// a-z, A-Z, 0-9, _
satisfy(|c| (is_alphanumeric(c as u8) || c == '_')),
// initial vector
Vec::new,
// once it matches, append the matched item to the vector.
|mut acc: Vec<_>, item| {
acc.push(item);
acc
}
)))(input);
}
```
## 平面操作
### 基本函數與直譯器
我們藉由以上的概念可以定義一個將文字、線條等形狀排列到2D平面的語法畢竟不論輸出PDF、SVG等等粗略而言就是一種2D平面安放文字的語言。另外PDF的格式相當晦澀就算_PDF Explained_的PDF教學也還是要輔助使用其他的工具沒辦法看了就自己手刻PDF所以還是用`printpdf`來教學吧。
現在我們初始化一個專案目錄然後將需要的S-exp函式庫和pdf函數庫指定為相依函式庫
```
cargo init;
cargo add rsexp printpdf;
```
我們可以定義一些表達式包含函數、資料結構S-exp形式的說明如下。`'()`表示空列表(empty list),因為都要表達是函數的引用,所有的函數寫成形式`(Func "函數名稱" (引數1 引數2 ....))`。Float指64位元浮點數
```
(px Float) ; px表達pixel單位儲存浮點數
(pt Float) ; pt表達point單位儲存浮點數
(style (str pt)) ; 文字樣式。String表示字型的路徑[fontPath]Float表示字型大小(in Pt) (fontSize)
(str String) ; 儲存字串
(func "createPDF" '()) ;新增PDF
(func "createPage" '()) ;新增頁面
(func "writePdf" '(str)) ;寫入PDF頁面String是PATH
(func "putchar" '(str style x y)) ; x 軸向右y 軸向下str 表示字元(char)style 表示文字樣式
```
`main.rs`先引用函式庫:
`use printpdf::*;`
其中 `px`、`pt`是單位,所以可以在`main.rs`這樣定義:
```
enum Measure{
Pt(f64),
Px(f64)
}
```
最後一次定義expression
```
enum Expr{
Mea(Measure), // wrapper for measure
Str(&str),
Style{font_path : Measure, size : Measure},
Func(&str, Vec<Expr>),
Void // return nothing
}
```
然後我們可以這樣定義一個處理輸入輸出的interpreter於`interp`,並修改`main.rs`如下,縱使我們準時:
```
fn interp(exp : Expr)->(){
// the function will be extended.
match exp {
Expr::Mea(Measure::Pt(x)) => println!("{:?} pt", x),
Expr::Mea(Measure::Px(x)) => println!("{:?} px", x),
_ => println!("not found expression"),
};
}
// exexute interpreter
fn main() {
interp(Expr::Mea(Measure::Pt(2.2)));
interp(Expr::Flo(2.2));
}
```

View file

View file

@ -1,8 +1,26 @@
# Another Typesetter - 另一個排版器
## 序言
本文是講一個排版器的雛形如何製作的考察,若有任何建議,請聯絡作者 [yoxem@kianting.info](mailto:yoxem@kianting.info)
## 摘要
本文是講一個排版器的雛形如何製作的考察,使用Rust語言
內容部分參考[Essentials of Compilation An Incremental Approach in Racket](https://mitpress.mit.edu/9780262047760/essentials-of-compilation/)(EoC)的思路但因為目的不一樣所以裡面的內容不太相同。另外EoC主要是講
###序言
以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。
但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的 _Digital Typography_,想要瞭解斷行演算法,結果粗估五、六十頁,所以幾乎沒有讀。
另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy G. Siek所著作之 *Essential of Complication: An Incremental Approach in Racket*編譯之要素Racket語言的遞增的方法。我想到既然編譯器這種複雜的軟體可以一層一層的用pass來遞增功能就像水彩從背景、大物體一直由少漸多的完成。而排版軟體也是把使用者輸入的排版之領域特定語言(DSL)轉換成文字、圖形和二維座標對應關係最後匯出成PDF或SVG等等的編譯器若是能夠用層層遞增的方法來完成相信也能夠避免結構的複雜化導致錯誤容易發生的挫折。
然而排版語言不只是輸入文字轉圖形而已,更重要的是還要有因應美觀的自動斷行(justification)和斷字(hyphenation)等等的演算法、還有PDF的基本知識、字型函式庫的取用、排版要求多欄、甚至還牽涉到語言特有的特性比如東亞全形文字漢字、諺文、日文假名、注音符號和非全形文字中間要加空白以及從左寫到右的文字希伯來字母和阿拉伯字母等的排版方法不一而足。
為了簡化起見且目標讀者是臺灣的受眾本書僅涉及到ASCII英文字母——頂多加些一些附加符號(diacritics)和漢字的排版。其他的功能希望讀者可以漸次由少漸多的附加。另外這邊會使用到一些LISP的表達式來表達抽象語法樹若是不懂的話可以看一點教 Lisp或是Scheme的書如SICP。另外這本書不是編譯原理和描述PDF規格的書不涉獵底層的知識有需要的可以參考相關領域的書。
### 先備知識
這不是教一位入門使用者如從零知識撰寫排版軟體的書讀者應該有知道如何使用靜態型別語言的經驗比如一點C、或是Rust等等。另外抽象語法樹為求方便使用LISP撰寫所以需要會LISP和Scheme的知識知名教科書SICP的開頭可以讀一讀
這本書也不教編譯理論和tokenizing、parsing、狀態機等等的頂多只會帶到一些很基礎的知識有需要的請另外再讀。所以使用者需要會有使用正規表達式(regex)的能力。
操作環境使用Linux。需要安裝fontconfig等套件。
- [定義抽象語法樹和語法](./defineASTandGrammar)

BIN
docs/index.pdf Normal file

Binary file not shown.

193
docs/index.typ Normal file
View file

@ -0,0 +1,193 @@
#set heading(numbering: "1.1.1.1.")
#show raw: set text(font: "Noto Sans Mono CJK TC")
#set page("a5")
#set text(
font: ("New Computer Modern", "AR PL UMing TW"),
size: 11pt
)
#show heading: it => [
#set text(font: "Noto Serif CJK TC",
weight: "black")
#it.body
]
#set par( justify: true,leading: 1em,
)
#align(center)[#set text(
font: ("EB Garamond 08"),
weight:"medium",
size: 20pt,
)
Clo: another typesetter]
#align(center)[#box([#set text(size: 15pt,
font: "Noto Serif CJK TC",
weight:"medium")
一個排版器的實作心得])]
#box(
height:0.5em
)
#align(center)[#box([#set text(size: 11pt,
font: "AR PL UMing TW",
weight:"light")
陳建町])]
#pagebreak()
#set page(
margin: (top: 60pt, bottom: 20pt),
header: locate(
loc => if (calc.odd(loc.page()) == true){
[#set align(right)
#numbering("i", loc.page())
]
} else {
[#set align(left)
#numbering("i", loc.page())]
}
));
#heading(level:2, "版權聲明",outlined:false)
(c) 2023 陳建町 (Tan, Kian-ting)
本書內容非經許可,禁止複製、分發、商業使用等違反著作權法之行為。
然書中之程式碼,採用 #link("https://opensource.org/license/mit/")[MIT許可證]授權。
#pagebreak()
#outline(
title: align(left, [目#box(width:1em)錄 #box(
height:1.5em)]),
target: heading.where(outlined: true),
)
#pagebreak()
#set page(
numbering: "i",
number-align: top+right)
#heading(numbering: none, "序言")
以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。
但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的 _Digital Typography_想要瞭解斷行演算法結果粗估五、六十頁所以幾乎沒有讀。
另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy G. Siek所著作之_Essential of Complication: An Incremental Approach in Racket_編譯之要素Racket語言的遞增的方法。我想到既然編譯器這種複雜的軟體可以一層一層的用pass來遞增功能就像水彩從背景、大物體一直由少漸多的完成。而排版軟體也是把使用者輸入的排版之領域特定語言(DSL)轉換成文字、圖形和二維座標對應關係最後匯出成PDF或SVG等等的編譯器若是能夠用層層遞增的方法來完成相信也能夠避免結構的複雜化導致錯誤容易發生的挫折。
然而排版語言不只是輸入文字轉圖形而已,更重要的是還要有因應美觀的自動斷行(justification)和斷字(hyphenation)等等的演算法、還有PDF的基本知識、字型函式庫的取用、排版要求多欄、甚至還牽涉到語言特有的特性比如東亞全形文字漢字、諺文、日文假名、注音符號和非全形文字中間要加空白以及從左寫到右的文字希伯來字母和阿拉伯字母等的排版方法不一而足。
為了簡化起見且目標讀者是臺灣的受眾本書僅涉及到ASCII英文字母——頂多加些一些附加符號(diacritics)和漢字的排版。其他的功能希望讀者可以漸次由少漸多的附加。另外這邊會使用到一些LISP的表達式來表達抽象語法樹若是不懂的話可以看一點教 Lisp或是Scheme的書如SICP。另外這本書不是編譯原理和描述PDF規格的書不涉獵底層的知識有需要的可以參考相關領域的書。
#heading(numbering: none, "致謝")
感謝Donald Knuth教授開發出這麼一套排版系統以及排版的演算法除了造福科學排版的諸多用戶外也間接鼓舞我想要研究排版軟體如何實作感謝Jeremy G.Siek老師的_Essential of Complication: An Incremental Approach in Racket_讓我獲得排版語言編譯器設計的啟發。感謝王垠讓我對編譯器相關的技術有興趣從而斷斷續續學習相關的資訊。
感謝愛爾蘭語除了讓我對語言和語言復興的知識打開新的世界以外這個軟體的名字Clo也是從這裡來的cló有「活字」的意思因為技術限制抱歉沒辦法輸入長音符號
感謝我的父母,雖然專長不是電腦資訊科技,但是要感謝他們讓我讓我有餘力能夠在中學的時候研究這種興趣,這條路才能走下去。
感謝這本書閱讀的人們,讓我知道筆者不是孤單的。
Siōng-āu Kám-siā góa ê Siōng Chú, nā-bô i ê hû-chhî kap pó-siú, chit-pún chheh iā bô-hó oân-sêng.(最後感謝上主,若無扶持保守,這本書也很難完成)
#pagebreak()
#set page(
margin: (top: 60pt, bottom: 20pt),
header: locate(
loc =>{
let chapter_query = query(selector(heading.where(level: 1)).after(loc),loc)
let section_query = query(selector(heading.where(level: 2)).after(loc),loc)
let chapter = "";
let section = "";
if chapter_query == (){chapter = ""}
else{chapter = chapter_query.at(0).body};
if section_query == (){section = ""}
else{section = section_query.at(0).body}
if (calc.odd(loc.page()) == true){
grid(
columns: (0.333333fr, 0.333333fr, 0.333333fr),
text(style: "italic")[ ],
[#set align(center)
#chapter],
[ #h(1fr) #loc.page-numbering()])
} else {
grid(
columns: (0.333333fr, 0.333333fr, 0.333333fr),
text(style: "italic")[#loc.page-numbering()],
[#set align(center)
#section],
[ ])
}}
));
#show heading: it => [
#set text(font: ("New Computer Modern", "Noto Serif CJK TC"),
weight: "black")
#counter(heading).display() #it
]
#set page(numbering: "1")
#counter(page).update(1)
#set heading(numbering: "1.1.1.1.1")
= 先備知識
這不是教一位入門使用者如從零知識撰寫排版軟體的書讀者應該有知道如何使用靜態型別語言的經驗比如一點C、或是Rust等等。另外抽象語法樹為求方便使用LISP撰寫所以需要會LISP和Scheme的知識知名教科書SICP的開頭可以讀一讀
這本書也不教編譯理論和tokenizing、parsing、狀態機等等的頂多只會帶到一些很基礎的知識有需要的請另外再讀。所以使用者需要會有使用正規表達式(regex)的能力。
== 抽象語法樹
C語言、Python語言就算有許多的關鍵字、操作符、符號或是常數變數在編譯器分析語法以後最後會轉成編譯器可以操作的樹結構然後再轉成我們想要的另一個語言的樹最後輸出另一個語言的程式碼。
但是什麼叫做抽象語法樹呢?我們先從一點句法知識來談。
學過中學國文文法的課程,會背一堆類似「主詞+動詞+受詞」、「主詞+(有/無)+受詞」的結構。可以換個說法,是句子=「主詞+動詞+受詞」或是「主詞+(有/無)+賓詞」的形式。我們將「=」寫成「::=」,「/」(或是)寫成「|」,動詞擴充變成「動詞片語」,就變成:
```
句子 ::= (主詞 動詞片語 受詞) | (主詞 (有 | 無) 受詞)...
```
用這種形式表示的語言句法叫做「BNF文法」。這種句法看起來很語言學但是我們想受詞和主詞可以為名詞、專有名詞或是「形容詞+名詞」;動詞片語可以為動詞或是「副詞+動詞」。因此這樣之規則就可以生成許多句子比如「我有筆」、「張三養貓」、「小芳慢慢移動檯燈」等等的句子。然後句子可以用上述規則分析成語法的樹狀結構如圖1把「我曾旅居新竹」寫成語法樹。
#figure(
image("syntaxtree.svg", width: 40%),
caption: [
「我曾旅居新竹」的語法樹
],
supplement: [圖],
)
同理,程式語言通常也有更嚴謹的這樣生成文法,可以用幾個簡單規則生出繁多的程式碼,而且合乎語法規定。這種生成文法也可檢查輸入的程式碼有沒有符合句法的規定。而這種語法生成的程式碼,去掉不需要的逗號等等符號,當然也可以做成語法樹,就是抽象語法樹 (abstract syntax tree, AST)如圖2所示。
#figure(
image("syntaxtree2.svg", width: 30%),
caption: [
`(2+2) == 4`的語法樹。注意括號已經刪除。
],
supplement: [圖],
)
而上文的抽象語法樹可以是我們把程式經過編譯器分析之後用「樹」儲存的資料結構。而樹形結構我們可以使用Lisp語言的S表達式(S-expressiom; S-exp)來表示,本文採用這樣的表示方法。所以上文的`(2+2)==4`即`(== (+ 2 2) 4)``let baz = foo("bar")`若是把foo("bar")這種函數套用(apply)寫成`(APPLY foo "bar")`則其S-exp語法樹可寫為`(let baz(APPLY foo "bar"))`。

24
docs/index2.md Normal file
View file

@ -0,0 +1,24 @@
[ Clo: another typesetter]{align="center"} [[
一個排版器的實作心得]{.box}]{align="center"} []{.box} [[
陳建町]{.box}]{align="center"}
版權聲明
\(c\) 2023 陳建町 (Tan, Kian-ting)
本書內容非經許可,禁止複製、分發、商業使用等違反著作權法之行為。
然書中之程式碼,採用
[MIT許可證](https://opensource.org/license/mit/)授權。
序言
以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。
但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的
*Digital
Typography*,想要瞭解斷行演算法,結果粗估五、六十頁,所以幾乎沒有讀。
另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy
G. Siek所著作之_Essential of Complication: An Incremental Approach in
Racket

1
docs/syntaxtree.svg Normal file
View file

@ -0,0 +1 @@
<svg baseProfile="full" height="248px" preserveAspectRatio="xMidYMid meet" style="font-family: times, serif; font-weight: normal; font-style: normal; font-size: 16px;" version="1.1" viewBox="0,0,144.0,248.0" width="144px" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">句子</text></svg><svg width="27.7778%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">主詞</text></svg><svg width="100%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">代詞 </text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px"></text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="72px" /></svg><line stroke="black" x1="50%" x2="50%" y1="19.2px" y2="56px" /></svg><line stroke="black" x1="50%" x2="13.8889%" y1="19.2px" y2="48px" /><svg width="72.2222%" x="27.7778%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">謂語</text></svg><svg width="69.2308%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">動詞</text><text text-anchor="middle" x="50%" y="32px">片語 </text></svg><svg width="44.4444%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">副詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px"></text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="22.2222%" y1="35.2px" y2="72px" /><svg width="55.5556%" x="44.4444%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">動詞 </text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">旅居</text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="72.2222%" y1="35.2px" y2="72px" /></svg><line stroke="black" x1="50%" x2="34.6154%" y1="19.2px" y2="48px" /><svg width="30.7692%" x="69.2308%" y="48px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">受詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">專有</text><text text-anchor="middle" x="50%" y="32px">名詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">新竹</text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="35.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="84.6154%" y1="19.2px" y2="56px" /></svg><line stroke="black" x1="50%" x2="63.8889%" y1="19.2px" y2="48px" /></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

1
docs/syntaxtree2.svg Normal file
View file

@ -0,0 +1 @@
<svg baseProfile="full" height="120px" preserveAspectRatio="xMidYMid meet" style="font-family: times, serif; font-weight: normal; font-style: normal; font-size: 16px;" version="1.1" viewBox="0,0,72.0,120.0" width="72px" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">==</text></svg><svg width="66.6667%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">+</text></svg><svg width="50%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">1</text></svg></svg><line stroke="black" x1="50%" x2="25%" y1="19.2px" y2="48px" /><svg width="50%" x="50%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">1</text></svg></svg><line stroke="black" x1="50%" x2="75%" y1="19.2px" y2="48px" /></svg><line stroke="black" x1="50%" x2="33.3333%" y1="19.2px" y2="48px" /><svg width="33.3333%" x="66.6667%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">2</text></svg></svg><line stroke="black" x1="50%" x2="83.3333%" y1="19.2px" y2="48px" /></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1,5 +1,11 @@
site_name: Another Typesetter 另一個排版器
site_url: https://blog.kianting.info/pages/typesetter
site_url: https://blog.kianting.info/pages/docs/anotherTypeSetter/
nav:
- Home: index.md
theme: readthedocs
- Ch 1: defineASTandGrammar.md
- Ch 2: 2DManipulating.md
theme: readthedocs
markdown_extensions:
- attr_list
- md_in_html

1
mkdocs.yml~ Normal file
View file

@ -0,0 +1 @@
site_name: My Docs

View file

@ -1,2 +0,0 @@
# 定義抽象語法樹和語法

View file

@ -8,14 +8,14 @@
<link rel="shortcut icon" href="/pages/typesetter/img/favicon.ico">
<link rel="shortcut icon" href="/pages/docs/anotherTypeSetter/img/favicon.ico">
<title>Another Typesetter 另一個排版器</title>
<link rel="stylesheet" href="/pages/typesetter/css/theme.css" />
<link rel="stylesheet" href="/pages/typesetter/css/theme_extra.css" />
<link rel="stylesheet" href="/pages/docs/anotherTypeSetter/css/theme.css" />
<link rel="stylesheet" href="/pages/docs/anotherTypeSetter/css/theme_extra.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" />
<script src="/pages/typesetter/js/jquery-2.1.1.min.js" defer></script>
<script src="/pages/typesetter/js/modernizr-2.8.3.min.js" defer></script>
<script src="/pages/docs/anotherTypeSetter/js/jquery-2.1.1.min.js" defer></script>
<script src="/pages/docs/anotherTypeSetter/js/modernizr-2.8.3.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
@ -29,9 +29,9 @@
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href="/pages/typesetter/." class="icon icon-home"> Another Typesetter 另一個排版器</a>
<a href="/pages/docs/anotherTypeSetter/." class="icon icon-home"> Another Typesetter 另一個排版器</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="/pages/typesetter/search.html" method="get">
<form id ="rtd-search-form" class="wy-form" action="/pages/docs/anotherTypeSetter//search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
@ -39,7 +39,15 @@
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="/pages/typesetter/.">Home</a>
<li class="toctree-l1"><a class="reference internal" href="/pages/docs/anotherTypeSetter/.">Home</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="/pages/docs/anotherTypeSetter/defineASTandGrammar/">Ch 1</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="" href="/pages/docs/anotherTypeSetter/2DManipulating.md">Ch 2</a>
</li>
</ul>
</div>
@ -51,7 +59,7 @@
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="/pages/typesetter/.">Another Typesetter 另一個排版器</a>
<a href="/pages/docs/anotherTypeSetter/.">Another Typesetter 另一個排版器</a>
</nav>
@ -59,7 +67,7 @@
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/pages/typesetter/.">Docs</a> &raquo;</li>
<li><a href="/pages/docs/anotherTypeSetter/.">Docs</a> &raquo;</li>
<li class="wy-breadcrumbs-aside">
@ -107,9 +115,9 @@
</span>
</div>
<script>var base_url = '/pages/typesetter';</script>
<script src="/pages/typesetter/js/theme.js" defer></script>
<script src="/pages/typesetter/search/main.js" defer></script>
<script>var base_url = '/pages/docs/anotherTypeSetter/';</script>
<script src="/pages/docs/anotherTypeSetter/js/theme.js" defer></script>
<script src="/pages/docs/anotherTypeSetter/search/main.js" defer></script>
<script defer>
window.onload = function () {
SphinxRtdTheme.Navigation.enable(true);

View file

View file

@ -7,18 +7,18 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://blog.kianting.info/pages/typesetter/defineASTandGrammar/">
<link rel="canonical" href="https://blog.kianting.info/pages/docs/anotherTypeSetter/defineASTandGrammar/">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>defineASTandGrammar - Another Typesetter 另一個排版器</title>
<title>Ch 1 - Another Typesetter 另一個排版器</title>
<link rel="stylesheet" href="../css/theme.css" />
<link rel="stylesheet" href="../css/theme_extra.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" />
<script>
// Current page data
var mkdocs_page_name = "defineASTandGrammar";
var mkdocs_page_name = "Ch 1";
var mkdocs_page_input_path = "defineASTandGrammar.md";
var mkdocs_page_url = "/pages/typesetter/defineASTandGrammar/";
var mkdocs_page_url = "/pages/docs/anotherTypeSetter/defineASTandGrammar/";
</script>
<script src="../js/jquery-2.1.1.min.js" defer></script>
@ -49,6 +49,28 @@
<li class="toctree-l1"><a class="reference internal" href="..">Home</a>
</li>
</ul>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal current" href="./">Ch 1</a>
<ul class="current">
<li class="toctree-l2"><a class="reference internal" href="#_1">抽象語法樹</a>
</li>
<li class="toctree-l2"><a class="reference internal" href="#_2">決定語法</a>
</li>
<li class="toctree-l2"><a class="reference internal" href="#parsercombinatortokenize">用ParserCombinator進行tokenize</a>
</li>
<li class="toctree-l2"><a class="reference internal" href="#_3">平面操作</a>
<ul>
<li class="toctree-l3"><a class="reference internal" href="#_4">基本函數與直譯器</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="" href="../2DManipulating.md">Ch 2</a>
</li>
</ul>
</div>
</div>
</nav>
@ -70,7 +92,7 @@
<li>defineASTandGrammar</li>
<li>Ch 1</li>
<li class="wy-breadcrumbs-aside">
</li>
@ -81,12 +103,175 @@
<div role="main">
<div class="section">
<h1 id="ch1">Ch1 定義抽象語法樹和語法</h1>
<h2 id="_1">抽象語法樹</h2>
<p>C語言、Python語言就算有許多的關鍵字、操作符、符號或是常數變數在編譯器分析語法以後最後會轉成編譯器可以操作的樹結構然後再轉成我們想要的另一個語言的樹最後輸出另一個語言的程式碼。</p>
<p>但是什麼叫做抽象語法樹呢?我們先從一點句法知識來談。</p>
<p>學過中學國文文法的課程,會背一堆類似「主詞+動詞+受詞」、「主詞+(有/無)+受詞」的結構。可以換個說法,是句子=「主詞+動詞+受詞」或是「主詞+(有/無)+賓詞」的形式。我們將「=」寫成「::=」,「/」(或是)寫成「|」,「動詞」擴充變成「動詞片語」,就變成:</p>
<pre><code> 句子 ::= (主詞 動詞片語 受詞) | (主詞 (有 | 無) 受詞)...
</code></pre>
<p>為了易讀所以寫成:</p>
<pre><code>句子 ::= 主詞 動詞片語 受詞
| 主詞 (有 | 無) 受詞
| ...
</code></pre>
<p>用這種形式表示的語言句法叫做「BNF文法」。這種句法看起來很語言學但是我們想受詞和主詞可以為名詞、專有名詞或是「形容詞+名詞」;動詞片語可以為動詞或是「副詞+動詞」。因此這樣之規則,就可以生成許多句子,比如「我有筆」、「張三養貓」、「小芳慢慢移動檯燈」等等的句子。然後句子可以用上述規則,分析成語法的樹狀結構,如下圖把「我曾旅居新竹」寫成語法樹。</p>
<figure>
<p><img alt="「我曾旅居新竹」的語法樹" src="../syntaxtree.svg" title="" />
</p>
<figcaption>「我曾旅居新竹」的語法樹</figcaption>
</figure>
<p>同理,程式語言通常也有更嚴謹的這樣生成文法,可以用幾個簡單規則生出繁多的程式碼,而且合乎語法規定。這種生成文法也可檢查輸入的程式碼有沒有符合句法的規定。而這種語法生成的程式碼,去掉不需要的逗號等等符號,當然也可以做成語法樹,就是抽象語法樹 (abstract syntax tree, AST),如下圖所示。</p>
<figure>
<p><img alt="「(2+2) == 4」的語法樹。注意括號已經刪除。" src="../syntaxtree2.svg" title="" />
</p>
<figcaption>「(2+2) == 4」的語法樹。注意括號已經刪除。</figcaption>
</figure>
<p>而上文的抽象語法樹可以是我們把程式經過編譯器分析之後用「樹」儲存的資料結構。而樹形結構我們可以使用Lisp語言的S表達式(S-expressiom; S-exp)來表示,本文採用這樣的表示方法。所以上文的<code>(2+2)==4</code><code>(== (+ 2 2) 4)</code><code>let baz = foo("bar")</code>若是把foo("bar")這種函數套用(apply)寫成<code>(APPLY foo "bar")</code>則其S-exp語法樹可寫為<code>(let baz(APPLY foo "bar"))</code></p>
<h2 id="_2">決定語法</h2>
<p>那我們要如何制定這個語言的語法這樣我們才能夠寫出符合這個語法的函數然後再用tokenizer和parser轉成AST樹。</p>
<p>不考慮<code>+ - * /</code>這種運算子,以及向量的表示子,函數可以用<code>ID(arg1, arg2, ...)</code>這種方式來表示,其中<code>arg_x</code>是引數,<code>ID</code>是識別子identifier可以把它想成變函數的名字</p>
<p>變數可以是<code>ID</code><code>arg_n</code>可以是<code>ID</code>或常數(量)。</p>
<p>常數(量)的表示法可以是下列任一:</p>
<ul>
<li>
<p>浮點數如0.0, 36.8BNF風格的表達法為<code>[0-9]+ '.' [0-9]+</code><code>'c'</code>指c這個文字<code>+</code>表示前面的重複1次以上<code>[0-9]</code>表示數字0到9。</p>
</li>
<li>
<p>整數如22、0<code>[0-9]+</code></p>
</li>
<li>
<p>字串:<code>'"' (不是「"」的任一字元|('\' '"')) '"'</code><code>.</code>表示任何一個字元)</p>
</li>
</ul>
<p>然而我們還是需要綁定變數<code>let x = var in boby</code>(在<code>body</code>裡面,<code>x</code>指代<code>var</code>)、<code>set x = var</code>改變變數值、lambda<code>lambda (x)=&gt;{body}</code>。另外為了要區別要在PDF印上去的一般字元在這個檔案的常數、變數、函數、關鍵字等前後需要加@表示但是函數、lambda裡面的變數不用。比如<code>@foo(a, b)@</code><code>@lambda(x)@</code><code>@"IAmAString"@</code><code>@2.2@</code><code>@3@</code>後三者應該很少用到可是若需在PDF印<code>@</code>時怎辦?那就用<code>\@</code>。比如<code>foo\@example.com</code></p>
<p>所以我們可以定義以下的BNF風文法</p>
<pre><code>Language ::= PrintTxt | Exprs
PrintTxt ::= (('\' '@')| 非@字元)+ //「我是一隻貓」或是「www\@example.com」
Exprs ::= @ Expr* @ // *表示前面的重複0次以上包含不出現
Expr ::= (Letting | Setting | Lambda | Apply | Var| Const) | &quot;(&quot; Expr &quot;)&quot;
Letting ::= &quot;let&quot; Var &quot;=&quot; Expr &quot;in&quot; Expr // let foo = 12 in ...
Setting ::= Var &quot;:=&quot; Expr &quot;in&quot; Expr // foo := a in ...
Lambda ::= &quot;fn&quot; Var &quot;-&gt;&quot; Expr // fn x -&gt; 12
Apply ::= Expr Expr // foo 3 即foo(3)
Var ::= ID
Const ::= String | Float | Int
Int ::= [0-9]+
Float ::= [0-9]+ &quot;.&quot; [0-9]+
String ::= '&quot;' (不是「&quot;」的任一字元|('\' '&quot;')) '&quot;'
</code></pre>
<h2 id="parsercombinatortokenize">用ParserCombinator進行tokenize</h2>
<p>Parser combinator分析器組合子是一種利用高階函數來簡化分析器撰寫的辦法。講一個簡單的案例吧</p>
<p>假設我們想要將字串的開頭match 0~9 之中的其中一個我們可以寫一個函數match0to9如下</p>
<pre><code>function match0to9(string){
if (string[0] in 0,1,..,9){
let rest = string[1:];
let matched = string[0];
return {type: &quot;OK&quot;, rest : rest, matched : matched};
}
else{
return {type : &quot;Nothing&quot;};
}
}
</code></pre>
<p>假設我們要將字串的前兩個字的match 0~9呢如果會高階函數的話引入一個<code>then</code>函數,然後把<code>match0to9</code>傳進去,這樣寫起來比較簡潔:</p>
<pre><code>function thenDo(input, fun){
if (input.type != &quot;Nothing&quot;{
middle = fun(input.rest);
if (middle.type != &quot;Nothing&quot;){
middle.matched = input.matched + middle.matched
return middle;
}else{
return middle; // return nothing
}
}else{
input; // return nothing
}
}
</code></pre>
<h2 id="_3">平面操作</h2>
<h3 id="_4">基本函數與直譯器</h3>
<p>我們藉由以上的概念可以定義一個將文字、線條等形狀排列到2D平面的語法畢竟不論輸出PDF、SVG等等粗略而言就是一種2D平面安放文字的語言。另外PDF的格式相當晦澀就算_PDF Explained_的PDF教學也還是要輔助使用其他的工具沒辦法看了就自己手刻PDF所以還是用<code>printpdf</code>來教學吧。</p>
<p>現在我們初始化一個專案目錄然後將需要的S-exp函式庫和pdf函數庫指定為相依函式庫</p>
<pre><code>cargo init;
cargo add rsexp printpdf;
</code></pre>
<p>我們可以定義一些表達式包含函數、資料結構S-exp形式的說明如下。<code>'()</code>表示空列表(empty list),因為都要表達是函數的引用,所有的函數寫成形式<code>(Func "函數名稱" (引數1 引數2 ....))</code>。Float指64位元浮點數</p>
<pre><code>(px Float) ; px表達pixel單位儲存浮點數
(pt Float) ; pt表達point單位儲存浮點數
(style (str pt)) ; 文字樣式。String表示字型的路徑[fontPath]Float表示字型大小(in Pt) (fontSize)
(str String) ; 儲存字串
(func &quot;createPDF&quot; '()) ;新增PDF
(func &quot;createPage&quot; '()) ;新增頁面
(func &quot;writePdf&quot; '(str)) ;寫入PDF頁面String是PATH
(func &quot;putchar&quot; '(str style x y)) ; x 軸向右y 軸向下str 表示字元(char)style 表示文字樣式
</code></pre>
<p><code>main.rs</code>先引用函式庫:
<code>use printpdf::*;</code></p>
<p>其中 <code>px</code><code>pt</code>是單位,所以可以在<code>main.rs</code>這樣定義:</p>
<pre><code>enum Measure{
Pt(f64),
Px(f64)
}
</code></pre>
<p>最後一次定義expression</p>
<pre><code>enum Expr{
Mea(Measure), // wrapper for measure
Str(&amp;str),
Style{font_path : Measure, size : Measure},
Func(&amp;str, Vec&lt;Expr&gt;),
Void // return nothing
}
</code></pre>
<p>然後我們可以這樣定義一個處理輸入輸出的interpreter於<code>interp</code>,並修改<code>main.rs</code>如下,縱使我們準時:</p>
<pre><code>fn interp(exp : Expr)-&gt;(){
// the function will be extended.
match exp {
Expr::Mea(Measure::Pt(x)) =&gt; println!(&quot;{:?} pt&quot;, x),
Expr::Mea(Measure::Px(x)) =&gt; println!(&quot;{:?} px&quot;, x),
_ =&gt; println!(&quot;not found expression&quot;),
};
}
// exexute interpreter
fn main() {
interp(Expr::Mea(Measure::Pt(2.2)));
interp(Expr::Flo(2.2));
}
</code></pre>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href=".." class="btn btn-neutral" title="Home"><span class="icon icon-circle-arrow-left"></span> Previous</a>
</div>
<hr/>
@ -109,6 +294,8 @@
<span class="rst-current-version" data-toggle="rst-current-version">
<span><a href=".." style="color: #fcfcfc;">&laquo; Previous</a></span>
</span>
</div>

View file

@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="None">
<link rel="canonical" href="https://blog.kianting.info/pages/typesetter/">
<link rel="canonical" href="https://blog.kianting.info/pages/docs/anotherTypeSetter/">
<link rel="shortcut icon" href="img/favicon.ico">
<title>Another Typesetter 另一個排版器</title>
<link rel="stylesheet" href="css/theme.css" />
@ -18,7 +18,7 @@
// Current page data
var mkdocs_page_name = "Home";
var mkdocs_page_input_path = "index.md";
var mkdocs_page_url = "/pages/typesetter/";
var mkdocs_page_url = "/pages/docs/anotherTypeSetter/";
</script>
<script src="js/jquery-2.1.1.min.js" defer></script>
@ -48,11 +48,25 @@
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal current" href=".">Home</a>
<ul class="current">
<li class="toctree-l2"><a class="reference internal" href="#_1">序言</a>
<li class="toctree-l2"><a class="reference internal" href="#_1">摘要</a>
<ul>
<li class="toctree-l3"><a class="reference internal" href="#_2">序言</a>
</li>
<li class="toctree-l3"><a class="reference internal" href="#_3">先備知識</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="defineASTandGrammar/">Ch 1</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="" href="2DManipulating.md">Ch 2</a>
</li>
</ul>
</div>
</div>
</nav>
@ -86,9 +100,18 @@
<div class="section">
<h1 id="another-typesetter-">Another Typesetter - 另一個排版器</h1>
<h2 id="_1">序言</h2>
<p>本文是講一個排版器的雛形如何製作的考察,若有任何建議,請聯絡作者 <a href="mailto:yoxem@kianting.info">yoxem@kianting.info</a></p>
<p>內容部分參考<a href="https://mitpress.mit.edu/9780262047760/essentials-of-compilation/">Essentials of Compilation An Incremental Approach in Racket</a>(EoC)的思路但因為目的不一樣所以裡面的內容不太相同。另外EoC主要是講</p>
<h2 id="_1">摘要</h2>
<p>本文是講一個排版器的雛形如何製作的考察使用Rust語言。</p>
<h3 id="_2">序言</h3>
<p>以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。</p>
<p>但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的 <em>Digital Typography</em>,想要瞭解斷行演算法,結果粗估五、六十頁,所以幾乎沒有讀。</p>
<p>另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy G. Siek所著作之 <em>Essential of Complication: An Incremental Approach in Racket</em>編譯之要素Racket語言的遞增的方法。我想到既然編譯器這種複雜的軟體可以一層一層的用pass來遞增功能就像水彩從背景、大物體一直由少漸多的完成。而排版軟體也是把使用者輸入的排版之領域特定語言(DSL)轉換成文字、圖形和二維座標對應關係最後匯出成PDF或SVG等等的編譯器若是能夠用層層遞增的方法來完成相信也能夠避免結構的複雜化導致錯誤容易發生的挫折。</p>
<p>然而排版語言不只是輸入文字轉圖形而已,更重要的是還要有因應美觀的自動斷行(justification)和斷字(hyphenation)等等的演算法、還有PDF的基本知識、字型函式庫的取用、排版要求多欄、甚至還牽涉到語言特有的特性比如東亞全形文字漢字、諺文、日文假名、注音符號和非全形文字中間要加空白以及從左寫到右的文字希伯來字母和阿拉伯字母等的排版方法不一而足。</p>
<p>為了簡化起見且目標讀者是臺灣的受眾本書僅涉及到ASCII英文字母——頂多加些一些附加符號(diacritics)和漢字的排版。其他的功能希望讀者可以漸次由少漸多的附加。另外這邊會使用到一些LISP的表達式來表達抽象語法樹若是不懂的話可以看一點教 Lisp或是Scheme的書如SICP。另外這本書不是編譯原理和描述PDF規格的書不涉獵底層的知識有需要的可以參考相關領域的書。</p>
<h3 id="_3">先備知識</h3>
<p>這不是教一位入門使用者如從零知識撰寫排版軟體的書讀者應該有知道如何使用靜態型別語言的經驗比如一點C、或是Rust等等。另外抽象語法樹為求方便使用LISP撰寫所以需要會LISP和Scheme的知識知名教科書SICP的開頭可以讀一讀</p>
<p>這本書也不教編譯理論和tokenizing、parsing、狀態機等等的頂多只會帶到一些很基礎的知識有需要的請另外再讀。所以使用者需要會有使用正規表達式(regex)的能力。</p>
<p>操作環境使用Linux。需要安裝fontconfig等套件。</p>
<ul>
<li><a href="./defineASTandGrammar">定義抽象語法樹和語法</a></li>
</ul>
@ -97,6 +120,13 @@
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="defineASTandGrammar/" class="btn btn-neutral float-right" title="Ch 1">Next <span class="icon icon-circle-arrow-right"></span></a>
</div>
<hr/>
@ -120,6 +150,8 @@
<span style="margin-left: 15px"><a href="defineASTandGrammar/" style="color: #fcfcfc">Next &raquo;</a></span>
</span>
</div>
<script>var base_url = '.';</script>
@ -136,5 +168,5 @@
<!--
MkDocs version : 1.1.2
Build Date UTC : 2023-11-26 09:43:07.856027+00:00
Build Date UTC : 2023-12-01 16:29:33.709363+00:00
-->

BIN
site/index.pdf Normal file

Binary file not shown.

193
site/index.typ Normal file
View file

@ -0,0 +1,193 @@
#set heading(numbering: "1.1.1.1.")
#show raw: set text(font: "Noto Sans Mono CJK TC")
#set page("a5")
#set text(
font: ("New Computer Modern", "AR PL UMing TW"),
size: 11pt
)
#show heading: it => [
#set text(font: "Noto Serif CJK TC",
weight: "black")
#it.body
]
#set par( justify: true,leading: 1em,
)
#align(center)[#set text(
font: ("EB Garamond 08"),
weight:"medium",
size: 20pt,
)
Clo: another typesetter]
#align(center)[#box([#set text(size: 15pt,
font: "Noto Serif CJK TC",
weight:"medium")
一個排版器的實作心得])]
#box(
height:0.5em
)
#align(center)[#box([#set text(size: 11pt,
font: "AR PL UMing TW",
weight:"light")
陳建町])]
#pagebreak()
#set page(
margin: (top: 60pt, bottom: 20pt),
header: locate(
loc => if (calc.odd(loc.page()) == true){
[#set align(right)
#numbering("i", loc.page())
]
} else {
[#set align(left)
#numbering("i", loc.page())]
}
));
#heading(level:2, "版權聲明",outlined:false)
(c) 2023 陳建町 (Tan, Kian-ting)
本書內容非經許可,禁止複製、分發、商業使用等違反著作權法之行為。
然書中之程式碼,採用 #link("https://opensource.org/license/mit/")[MIT許可證]授權。
#pagebreak()
#outline(
title: align(left, [目#box(width:1em)錄 #box(
height:1.5em)]),
target: heading.where(outlined: true),
)
#pagebreak()
#set page(
numbering: "i",
number-align: top+right)
#heading(numbering: none, "序言")
以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。
但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的 _Digital Typography_想要瞭解斷行演算法結果粗估五、六十頁所以幾乎沒有讀。
另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy G. Siek所著作之_Essential of Complication: An Incremental Approach in Racket_編譯之要素Racket語言的遞增的方法。我想到既然編譯器這種複雜的軟體可以一層一層的用pass來遞增功能就像水彩從背景、大物體一直由少漸多的完成。而排版軟體也是把使用者輸入的排版之領域特定語言(DSL)轉換成文字、圖形和二維座標對應關係最後匯出成PDF或SVG等等的編譯器若是能夠用層層遞增的方法來完成相信也能夠避免結構的複雜化導致錯誤容易發生的挫折。
然而排版語言不只是輸入文字轉圖形而已,更重要的是還要有因應美觀的自動斷行(justification)和斷字(hyphenation)等等的演算法、還有PDF的基本知識、字型函式庫的取用、排版要求多欄、甚至還牽涉到語言特有的特性比如東亞全形文字漢字、諺文、日文假名、注音符號和非全形文字中間要加空白以及從左寫到右的文字希伯來字母和阿拉伯字母等的排版方法不一而足。
為了簡化起見且目標讀者是臺灣的受眾本書僅涉及到ASCII英文字母——頂多加些一些附加符號(diacritics)和漢字的排版。其他的功能希望讀者可以漸次由少漸多的附加。另外這邊會使用到一些LISP的表達式來表達抽象語法樹若是不懂的話可以看一點教 Lisp或是Scheme的書如SICP。另外這本書不是編譯原理和描述PDF規格的書不涉獵底層的知識有需要的可以參考相關領域的書。
#heading(numbering: none, "致謝")
感謝Donald Knuth教授開發出這麼一套排版系統以及排版的演算法除了造福科學排版的諸多用戶外也間接鼓舞我想要研究排版軟體如何實作感謝Jeremy G.Siek老師的_Essential of Complication: An Incremental Approach in Racket_讓我獲得排版語言編譯器設計的啟發。感謝王垠讓我對編譯器相關的技術有興趣從而斷斷續續學習相關的資訊。
感謝愛爾蘭語除了讓我對語言和語言復興的知識打開新的世界以外這個軟體的名字Clo也是從這裡來的cló有「活字」的意思因為技術限制抱歉沒辦法輸入長音符號
感謝我的父母,雖然專長不是電腦資訊科技,但是要感謝他們讓我讓我有餘力能夠在中學的時候研究這種興趣,這條路才能走下去。
感謝這本書閱讀的人們,讓我知道筆者不是孤單的。
Siōng-āu Kám-siā góa ê Siōng Chú, nā-bô i ê hû-chhî kap pó-siú, chit-pún chheh iā bô-hó oân-sêng.(最後感謝上主,若無扶持保守,這本書也很難完成)
#pagebreak()
#set page(
margin: (top: 60pt, bottom: 20pt),
header: locate(
loc =>{
let chapter_query = query(selector(heading.where(level: 1)).after(loc),loc)
let section_query = query(selector(heading.where(level: 2)).after(loc),loc)
let chapter = "";
let section = "";
if chapter_query == (){chapter = ""}
else{chapter = chapter_query.at(0).body};
if section_query == (){section = ""}
else{section = section_query.at(0).body}
if (calc.odd(loc.page()) == true){
grid(
columns: (0.333333fr, 0.333333fr, 0.333333fr),
text(style: "italic")[ ],
[#set align(center)
#chapter],
[ #h(1fr) #loc.page-numbering()])
} else {
grid(
columns: (0.333333fr, 0.333333fr, 0.333333fr),
text(style: "italic")[#loc.page-numbering()],
[#set align(center)
#section],
[ ])
}}
));
#show heading: it => [
#set text(font: ("New Computer Modern", "Noto Serif CJK TC"),
weight: "black")
#counter(heading).display() #it
]
#set page(numbering: "1")
#counter(page).update(1)
#set heading(numbering: "1.1.1.1.1")
= 先備知識
這不是教一位入門使用者如從零知識撰寫排版軟體的書讀者應該有知道如何使用靜態型別語言的經驗比如一點C、或是Rust等等。另外抽象語法樹為求方便使用LISP撰寫所以需要會LISP和Scheme的知識知名教科書SICP的開頭可以讀一讀
這本書也不教編譯理論和tokenizing、parsing、狀態機等等的頂多只會帶到一些很基礎的知識有需要的請另外再讀。所以使用者需要會有使用正規表達式(regex)的能力。
== 抽象語法樹
C語言、Python語言就算有許多的關鍵字、操作符、符號或是常數變數在編譯器分析語法以後最後會轉成編譯器可以操作的樹結構然後再轉成我們想要的另一個語言的樹最後輸出另一個語言的程式碼。
但是什麼叫做抽象語法樹呢?我們先從一點句法知識來談。
學過中學國文文法的課程,會背一堆類似「主詞+動詞+受詞」、「主詞+(有/無)+受詞」的結構。可以換個說法,是句子=「主詞+動詞+受詞」或是「主詞+(有/無)+賓詞」的形式。我們將「=」寫成「::=」,「/」(或是)寫成「|」,動詞擴充變成「動詞片語」,就變成:
```
句子 ::= (主詞 動詞片語 受詞) | (主詞 (有 | 無) 受詞)...
```
用這種形式表示的語言句法叫做「BNF文法」。這種句法看起來很語言學但是我們想受詞和主詞可以為名詞、專有名詞或是「形容詞+名詞」;動詞片語可以為動詞或是「副詞+動詞」。因此這樣之規則就可以生成許多句子比如「我有筆」、「張三養貓」、「小芳慢慢移動檯燈」等等的句子。然後句子可以用上述規則分析成語法的樹狀結構如圖1把「我曾旅居新竹」寫成語法樹。
#figure(
image("syntaxtree.svg", width: 40%),
caption: [
「我曾旅居新竹」的語法樹
],
supplement: [圖],
)
同理,程式語言通常也有更嚴謹的這樣生成文法,可以用幾個簡單規則生出繁多的程式碼,而且合乎語法規定。這種生成文法也可檢查輸入的程式碼有沒有符合句法的規定。而這種語法生成的程式碼,去掉不需要的逗號等等符號,當然也可以做成語法樹,就是抽象語法樹 (abstract syntax tree, AST)如圖2所示。
#figure(
image("syntaxtree2.svg", width: 30%),
caption: [
`(2+2) == 4`的語法樹。注意括號已經刪除。
],
supplement: [圖],
)
而上文的抽象語法樹可以是我們把程式經過編譯器分析之後用「樹」儲存的資料結構。而樹形結構我們可以使用Lisp語言的S表達式(S-expressiom; S-exp)來表示,本文採用這樣的表示方法。所以上文的`(2+2)==4`即`(== (+ 2 2) 4)``let baz = foo("bar")`若是把foo("bar")這種函數套用(apply)寫成`(APPLY foo "bar")`則其S-exp語法樹可寫為`(let baz(APPLY foo "bar"))`。

148
site/index2/index.html Normal file
View file

@ -0,0 +1,148 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://blog.kianting.info/pages/docs/anotherTypeSetter/index2/">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>Index2 - Another Typesetter 另一個排版器</title>
<link rel="stylesheet" href="../css/theme.css" />
<link rel="stylesheet" href="../css/theme_extra.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" />
<script>
// Current page data
var mkdocs_page_name = "Index2";
var mkdocs_page_input_path = "index2.md";
var mkdocs_page_url = "/pages/docs/anotherTypeSetter/index2/";
</script>
<script src="../js/jquery-2.1.1.min.js" defer></script>
<script src="../js/modernizr-2.8.3.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
<div class="wy-side-scroll">
<div class="wy-side-nav-search">
<a href=".." class="icon icon-home"> Another Typesetter 另一個排版器</a>
<div role="search">
<form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" title="Type search term here" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="..">Home</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../defineASTandGrammar/">Ch 1</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="" href="../2DManipulating.md">Ch 2</a>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="..">Another Typesetter 另一個排版器</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="..">Docs</a> &raquo;</li>
<li>Index2</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main">
<div class="section">
<p>[ Clo: another typesetter]{align="center"} [[
一個排版器的實作心得]{.box}]{align="center"} []{.box} [[
陳建町]{.box}]{align="center"}</p>
<p>版權聲明</p>
<p>(c) 2023 陳建町 (Tan, Kian-ting)</p>
<p>本書內容非經許可,禁止複製、分發、商業使用等違反著作權法之行為。</p>
<p>然書中之程式碼,採用
<a href="https://opensource.org/license/mit/">MIT許可證</a>授權。</p>
<p>序言</p>
<p>以前從國中時候試用Linux以及架站以後就開始想用LaTeX排版些自己所寫的東西其中包含覺得LaTeX的語法不好想要重造輪子。就算後來大學沒有走上資訊工程這條路還是希望有天至少能夠完成個能用的雛形。</p>
<p>但是這是涉及字體檔案的處理、PDF的處理、語法分析後來自己因為不知道如何開發所以一直停擺。不是遇到很多蟲就是效能問題有缺失。因為時間繁忙很少更不消說了。甚至買了Knuth教授的
<em>Digital
Typography</em>,想要瞭解斷行演算法,結果粗估五、六十頁,所以幾乎沒有讀。</p>
<p>另外筆者一個分支興趣是編譯器的相關知識所以開始讀和王垠的編譯器思想系出同門的Jeremy
G. Siek所著作之_Essential of Complication: An Incremental Approach in
Racket</p>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<!-- Copyright etc -->
</div>
Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<div class="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version">
</span>
</div>
<script>var base_url = '..';</script>
<script src="../js/theme.js" defer></script>
<script src="../search/main.js" defer></script>
<script defer>
window.onload = function () {
SphinxRtdTheme.Navigation.enable(true);
};
</script>
</body>
</html>

View file

@ -42,6 +42,14 @@
<li class="toctree-l1"><a class="reference internal" href="./.">Home</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="./defineASTandGrammar/">Ch 1</a>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="" href="./2DManipulating.md">Ch 2</a>
</li>
</ul>
</div>
</div>
</nav>

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url>
<loc>https://blog.kianting.info/pages/typesetter/</loc>
<lastmod>2023-11-26</lastmod>
<loc>https://blog.kianting.info/pages/docs/anotherTypeSetter/</loc>
<lastmod>2023-12-01</lastmod>
<changefreq>daily</changefreq>
</url><url>
<loc>https://blog.kianting.info/pages/docs/anotherTypeSetter/defineASTandGrammar/</loc>
<lastmod>2023-12-01</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>

Binary file not shown.

1
site/syntaxtree.svg Normal file
View file

@ -0,0 +1 @@
<svg baseProfile="full" height="248px" preserveAspectRatio="xMidYMid meet" style="font-family: times, serif; font-weight: normal; font-style: normal; font-size: 16px;" version="1.1" viewBox="0,0,144.0,248.0" width="144px" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">句子</text></svg><svg width="27.7778%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">主詞</text></svg><svg width="100%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">代詞 </text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px"></text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="72px" /></svg><line stroke="black" x1="50%" x2="50%" y1="19.2px" y2="56px" /></svg><line stroke="black" x1="50%" x2="13.8889%" y1="19.2px" y2="48px" /><svg width="72.2222%" x="27.7778%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">謂語</text></svg><svg width="69.2308%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">動詞</text><text text-anchor="middle" x="50%" y="32px">片語 </text></svg><svg width="44.4444%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">副詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px"></text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="22.2222%" y1="35.2px" y2="72px" /><svg width="55.5556%" x="44.4444%" y="64px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">動詞 </text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">旅居</text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="72.2222%" y1="35.2px" y2="72px" /></svg><line stroke="black" x1="50%" x2="34.6154%" y1="19.2px" y2="48px" /><svg width="30.7692%" x="69.2308%" y="48px"><defs /><svg width="100%" x="0" y="8px"><defs /><text text-anchor="middle" x="50%" y="16px">受詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">專有</text><text text-anchor="middle" x="50%" y="32px">名詞</text></svg><svg width="100%" x="0%" y="64px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">新竹</text></svg></svg><line stroke="black" x1="50%" x2="50%" y1="35.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="50%" y1="27.2px" y2="64px" /></svg><line stroke="black" x1="50%" x2="84.6154%" y1="19.2px" y2="56px" /></svg><line stroke="black" x1="50%" x2="63.8889%" y1="19.2px" y2="48px" /></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

1
site/syntaxtree2.svg Normal file
View file

@ -0,0 +1 @@
<svg baseProfile="full" height="120px" preserveAspectRatio="xMidYMid meet" style="font-family: times, serif; font-weight: normal; font-style: normal; font-size: 16px;" version="1.1" viewBox="0,0,72.0,120.0" width="72px" xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">==</text></svg><svg width="66.6667%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">+</text></svg><svg width="50%" x="0%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">1</text></svg></svg><line stroke="black" x1="50%" x2="25%" y1="19.2px" y2="48px" /><svg width="50%" x="50%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">1</text></svg></svg><line stroke="black" x1="50%" x2="75%" y1="19.2px" y2="48px" /></svg><line stroke="black" x1="50%" x2="33.3333%" y1="19.2px" y2="48px" /><svg width="33.3333%" x="66.6667%" y="48px"><defs /><svg width="100%" x="0" y="0px"><defs /><text text-anchor="middle" x="50%" y="16px">2</text></svg></svg><line stroke="black" x1="50%" x2="83.3333%" y1="19.2px" y2="48px" /></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

32
src/ch1/Cargo.lock generated Normal file
View file

@ -0,0 +1,32 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "ch1"
version = "0.1.0"
dependencies = [
"nom",
]
[[package]]
name = "memchr"
version = "2.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]

9
src/ch1/Cargo.toml Normal file
View file

@ -0,0 +1,9 @@
[package]
name = "ch1"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom = "7.1.3"

80
src/ch1/src/main.rs Normal file
View file

@ -0,0 +1,80 @@
// import all the parser unit for string
use nom::character::{complete::*, is_alphanumeric, is_alphabetic};
#[macro_use]
extern crate nom;
// for the return type
use nom::IResult;
// collect all the parser matched strings,
use nom::combinator::recognize;
// given 2 parser and gets the result as (1stmatched, 2ndmatched),
use nom::sequence::pair;
// exact matching characters
use nom::bytes::complete::tag;
// match a parser 0+ times
use nom::multi::fold_many0;
// integer ::= [0-9]+
pub fn integer(input: &str) -> IResult<&str, &str> {
return digit1(input) ; // [0-9]+
}
// float ::= [0-9]+ "." [0-9]+
pub fn float(input: &str) -> IResult<&str, &str>{
// [0-9]+ "." [0-9]+
// "12.345" returns Ok((else, (("12", '.'), "345"))), then recgonize them as
// Ok("12.345")
let a =
recognize(pair(pair(digit1, tag(".")), digit1))(input);
return a;
}
// ("_" | [a-z] | [A-Z]) ("_" | [0-9] | [a-z] | [A-Z])+
pub fn identifier(input : &str) -> IResult<&str, &str>{
return recognize(pair(
// 1st character is a-z, A-Z or _
satisfy(|c| (is_alphabetic(c as u8) || c == '_')),
// the tail characters (0+ times matched) storing in a vector
fold_many0(
// a-z, A-Z, 0-9, _
satisfy(|c| (is_alphanumeric(c as u8) || c == '_')),
// initial vector
Vec::new,
// once it matches, append the matched item to the vector.
|mut acc: Vec<_>, item| {
acc.push(item);
acc
}
)))(input);
}
// test parser
#[cfg(test)]
mod tests {
// import the functions ouside mod tests
use super::*;
// test integer
#[test]
fn test_integer() {
//if no error is shown, the function passes the test
assert_eq!(integer("12345"), Ok(("", "12345")));
assert_eq!(integer("0"), Ok(("", "0")));
}
#[test]
fn test_float() {
assert_eq!(float("12.345"), Ok(("", "12.345")));
}
#[test]
fn test_identifier() {
assert_eq!(identifier("_"), Ok(("", "_")));
}
}

View file

@ -0,0 +1 @@
{"rustc_fingerprint":863783435189865176,"outputs":{"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.71.1 (eb26296b5 2023-08-03)\nbinary: rustc\ncommit-hash: eb26296b556cef10fb713a38f3d16b9886080f26\ncommit-date: 2023-08-03\nhost: x86_64-unknown-linux-gnu\nrelease: 1.71.1\nLLVM version: 16.0.5\n","stderr":""},"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/yoxem/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}

View file

@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

View file

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1,2 @@
{"message":"unused `#[macro_use]` import","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/main.rs","byte_start":109,"byte_end":121,"line_start":4,"line_end":4,"column_start":1,"column_end":13,"is_primary":true,"text":[{"text":"#[macro_use]","highlight_start":1,"highlight_end":13}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused `#[macro_use]` import\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/main.rs:4:1\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m4\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m#[macro_use]\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 1 warning emitted\u001b[0m\n\n"}

View file

@ -0,0 +1 @@
a6bf9d6458defbdc

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[]","target":8738920895606195810,"profile":7880216272462909439,"path":1684066648322511884,"deps":[[6954241390595330609,"nom",false,9528270570367385276]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ch1-07d4929d340d9efb/dep-test-bin-ch1"}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1,2 @@
{"message":"unused `#[macro_use]` import","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/main.rs","byte_start":109,"byte_end":121,"line_start":4,"line_end":4,"column_start":1,"column_end":13,"is_primary":true,"text":[{"text":"#[macro_use]","highlight_start":1,"highlight_end":13}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused `#[macro_use]` import\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/main.rs:4:1\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m4\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m#[macro_use]\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 1 warning emitted\u001b[0m\n\n"}

View file

@ -0,0 +1 @@
e72d5ea752ed1fe1

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[]","target":8738920895606195810,"profile":7364977192075987598,"path":1684066648322511884,"deps":[[6954241390595330609,"nom",false,8919617311978624897]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ch1-57fd53436cb557c8/dep-test-bin-ch1"}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[]","target":8738920895606195810,"profile":16217916096779473954,"path":1684066648322511884,"deps":[[6954241390595330609,"nom",false,8919617311978624897]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ch1-d2faebf0f4349873/dep-bin-ch1"}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1,4 @@
{"message":"unused `#[macro_use]` import","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/main.rs","byte_start":109,"byte_end":121,"line_start":4,"line_end":4,"column_start":1,"column_end":13,"is_primary":true,"text":[{"text":"#[macro_use]","highlight_start":1,"highlight_end":13}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused `#[macro_use]` import\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/main.rs:4:1\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m4\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m#[macro_use]\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
{"message":"`main` function not found in crate `ch1`","code":{"code":"E0601","explanation":"No `main` function was found in a binary crate.\n\nTo fix this error, add a `main` function:\n\n```\nfn main() {\n // Your program will start here.\n println!(\"Hello world!\");\n}\n```\n\nIf you don't know the basics of Rust, you can look at the\n[Rust Book][rust-book] to get started.\n\n[rust-book]: https://doc.rust-lang.org/book/\n"},"level":"error","spans":[{"file_name":"src/main.rs","byte_start":2063,"byte_end":2063,"line_start":80,"line_end":80,"column_start":2,"column_end":2,"is_primary":true,"text":[{"text":"}","highlight_start":2,"highlight_end":2}],"label":"consider adding a `main` function to `src/main.rs`","suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror[E0601]\u001b[0m\u001b[0m\u001b[1m: `main` function not found in crate `ch1`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/main.rs:80:2\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m80\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m}\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9m^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;9mconsider adding a `main` function to `src/main.rs`\u001b[0m\n\n"}
{"message":"aborting due to previous error; 1 warning emitted","code":null,"level":"error","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[38;5;9merror\u001b[0m\u001b[0m\u001b[1m: aborting due to previous error; 1 warning emitted\u001b[0m\n\n"}
{"message":"For more information about this error, try `rustc --explain E0601`.","code":null,"level":"failure-note","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1mFor more information about this error, try `rustc --explain E0601`.\u001b[0m\n"}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
dc04578d282f118e

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"alloc\", \"std\"]","target":13876443730220172507,"profile":7767436220172716501,"path":2387599723792994816,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/memchr-01dbc4587e7dba77/dep-lib-memchr"}}],"rustflags":[],"metadata":7513296495906230968,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
f410f339751f25a2

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"alloc\", \"std\"]","target":13876443730220172507,"profile":7890341536494525235,"path":2387599723792994816,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/memchr-6c3f2604a168adfc/dep-lib-memchr"}}],"rustflags":[],"metadata":7513296495906230968,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"std\"]","target":1009644266440026082,"profile":7767436220172716501,"path":10134622611887052030,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/minimal-lexical-053a98cbe8ddf902/dep-lib-minimal-lexical"}}],"rustflags":[],"metadata":2051824130325965549,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"std\"]","target":1009644266440026082,"profile":7890341536494525235,"path":10134622611887052030,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/minimal-lexical-69d29d1e7f21ab28/dep-lib-minimal-lexical"}}],"rustflags":[],"metadata":2051824130325965549,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
bc7e8ece99373b84

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"alloc\", \"default\", \"std\"]","target":1745534342555606081,"profile":7767436220172716501,"path":9978048319144250237,"deps":[[889836035008422344,"memchr",false,10237015279206335708],[10953957149292187054,"minimal_lexical",false,7398946875506747690]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/nom-2511ea9097602b48/dep-lib-nom"}}],"rustflags":[],"metadata":9858338621379386705,"config":2202906307356721367,"compile_kind":0}

View file

@ -0,0 +1 @@
This file has an mtime of when this was started.

View file

@ -0,0 +1 @@
8117e9e4afd8c87b

View file

@ -0,0 +1 @@
{"rustc":13782479574610989673,"features":"[\"alloc\", \"default\", \"std\"]","target":1745534342555606081,"profile":7890341536494525235,"path":9978048319144250237,"deps":[[889836035008422344,"memchr",false,11683779396626485492],[10953957149292187054,"minimal_lexical",false,1416385533553250497]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/nom-2e36d95dbcef1226/dep-lib-nom"}}],"rustflags":[],"metadata":9858338621379386705,"config":2202906307356721367,"compile_kind":0}

Binary file not shown.

View file

@ -0,0 +1,5 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-07d4929d340d9efb: src/main.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-07d4929d340d9efb.d: src/main.rs
src/main.rs:

View file

@ -0,0 +1,5 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-57fd53436cb557c8.rmeta: src/main.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-57fd53436cb557c8.d: src/main.rs
src/main.rs:

View file

@ -0,0 +1,5 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-d2faebf0f4349873.rmeta: src/main.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/ch1-d2faebf0f4349873.d: src/main.rs
src/main.rs:

Binary file not shown.

View file

@ -0,0 +1,33 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/memchr-01dbc4587e7dba77.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/libmemchr-01dbc4587e7dba77.rlib: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/memchr-01dbc4587e7dba77.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs:

View file

@ -0,0 +1,31 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/memchr-6c3f2604a168adfc.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/memchr-6c3f2604a168adfc.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/macros.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/packedpair/default_rank.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/rabinkarp.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/shiftor.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/all/twoway.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/generic/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/avx2/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/sse2/packedpair.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/arch/x86_64/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/cow.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/ext.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memchr.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/memmem/searcher.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/memchr-2.6.4/src/vector.rs:

View file

@ -0,0 +1,25 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/minimal_lexical-053a98cbe8ddf902.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/libminimal_lexical-053a98cbe8ddf902.rlib: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/minimal_lexical-053a98cbe8ddf902.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs:

View file

@ -0,0 +1,23 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/minimal_lexical-69d29d1e7f21ab28.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/minimal_lexical-69d29d1e7f21ab28.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bellerophon.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/bigint.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/extended_float.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/fpu.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/heapvec.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/lemire.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/libm.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/mask.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/num.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/number.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/parse.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/rounding.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/slow.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/stackvec.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_bellerophon.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_lemire.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/minimal-lexical-0.2.1/src/table_small.rs:

View file

@ -0,0 +1,28 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/nom-2511ea9097602b48.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/libnom-2511ea9097602b48.rlib: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/nom-2511ea9097602b48.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs:

View file

@ -0,0 +1,26 @@
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/nom-2e36d95dbcef1226.rmeta: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs
/home/yoxem/桌面/TMP/anotherTypesetter/src/ch1/target/debug/deps/nom-2e36d95dbcef1226.d: /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs /home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/lib.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/macros.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/error.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/branch/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/combinator/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/internal.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/multi/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/sequence/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/traits.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bits/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/bytes/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/character/streaming.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/str.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/mod.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/complete.rs:
/home/yoxem/.cargo/registry/src/index.crates.io-6f17d22bba15001f/nom-7.1.3/src/number/streaming.rs:

Some files were not shown because too many files have changed in this diff Show more