parser
This commit is contained in:
parent
2c341f6b0b
commit
b7905be518
393 changed files with 2526 additions and 39 deletions
|
@ -1,2 +0,0 @@
|
|||
# 定義抽象語法樹和語法
|
||||
|
|
@ -1 +0,0 @@
|
|||
yoxem@yoxem-HP-Laptop-15-fd0072.6714:1700948777
|
|
@ -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.8,BNF風格的表達法為:`[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));
|
||||
}
|
||||
```
|
0
docs/defineASTandGrammar.md~
Normal file
0
docs/defineASTandGrammar.md~
Normal 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
BIN
docs/index.pdf
Normal file
Binary file not shown.
193
docs/index.typ
Normal file
193
docs/index.typ
Normal 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
24
docs/index2.md
Normal 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
1
docs/syntaxtree.svg
Normal 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
1
docs/syntaxtree2.svg
Normal 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 |
10
mkdocs.yml
10
mkdocs.yml
|
@ -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
1
mkdocs.yml~
Normal file
|
@ -0,0 +1 @@
|
|||
site_name: My Docs
|
|
@ -1,2 +0,0 @@
|
|||
# 定義抽象語法樹和語法
|
||||
|
|
@ -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> »</li>
|
||||
<li><a href="/pages/docs/anotherTypeSetter/.">Docs</a> »</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);
|
||||
|
|
0
site/defineASTandGrammar.md~
Normal file
0
site/defineASTandGrammar.md~
Normal 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.8,BNF風格的表達法為:<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)=>{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) | "(" 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
|
||||
|
||||
Int ::= [0-9]+
|
||||
|
||||
Float ::= [0-9]+ "." [0-9]+
|
||||
|
||||
String ::= '"' (不是「"」的任一字元|('\' '"')) '"'
|
||||
</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: "OK", rest : rest, matched : matched};
|
||||
}
|
||||
else{
|
||||
return {type : "Nothing"};
|
||||
}
|
||||
}
|
||||
</code></pre>
|
||||
<p>假設我們要將字串的前兩個字的match 0~9呢?如果會高階函數的話,引入一個<code>then</code>函數,然後把<code>match0to9</code>傳進去,這樣寫起來比較簡潔:</p>
|
||||
<pre><code>function thenDo(input, fun){
|
||||
if (input.type != "Nothing"{
|
||||
|
||||
middle = fun(input.rest);
|
||||
if (middle.type != "Nothing"){
|
||||
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 "createPDF" '()) ;新增PDF
|
||||
(func "createPage" '()) ;新增頁面
|
||||
(func "writePdf" '(str)) ;寫入PDF頁面,String是PATH
|
||||
|
||||
(func "putchar" '(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(&str),
|
||||
Style{font_path : Measure, size : Measure},
|
||||
Func(&str, Vec<Expr>),
|
||||
Void // return nothing
|
||||
}
|
||||
</code></pre>
|
||||
<p>然後我們可以這樣定義一個處理輸入輸出的interpreter於<code>interp</code>,並修改<code>main.rs</code>如下,縱使我們準時:</p>
|
||||
<pre><code>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));
|
||||
}
|
||||
</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;">« Previous</a></span>
|
||||
|
||||
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
@ -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 »</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
BIN
site/index.pdf
Normal file
Binary file not shown.
193
site/index.typ
Normal file
193
site/index.typ
Normal 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
148
site/index2/index.html
Normal 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> »</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>
|
|
@ -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
|
@ -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
1
site/syntaxtree.svg
Normal 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
1
site/syntaxtree2.svg
Normal 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
32
src/ch1/Cargo.lock
generated
Normal 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
9
src/ch1/Cargo.toml
Normal 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
80
src/ch1/src/main.rs
Normal 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(("", "_")));
|
||||
}
|
||||
}
|
1
src/ch1/target/.rustc_info.json
Normal file
1
src/ch1/target/.rustc_info.json
Normal 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":{}}
|
3
src/ch1/target/CACHEDIR.TAG
Normal file
3
src/ch1/target/CACHEDIR.TAG
Normal 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/
|
0
src/ch1/target/debug/.cargo-lock
Normal file
0
src/ch1/target/debug/.cargo-lock
Normal file
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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"}
|
|
@ -0,0 +1 @@
|
|||
a6bf9d6458defbdc
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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"}
|
|
@ -0,0 +1 @@
|
|||
e72d5ea752ed1fe1
|
|
@ -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}
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -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"}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
dc04578d282f118e
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
f410f339751f25a2
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
2ae99062fb56ae66
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
c19071702303a813
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
bc7e8ece99373b84
|
|
@ -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}
|
Binary file not shown.
|
@ -0,0 +1 @@
|
|||
This file has an mtime of when this was started.
|
|
@ -0,0 +1 @@
|
|||
8117e9e4afd8c87b
|
|
@ -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}
|
BIN
src/ch1/target/debug/deps/ch1-07d4929d340d9efb
Executable file
BIN
src/ch1/target/debug/deps/ch1-07d4929d340d9efb
Executable file
Binary file not shown.
5
src/ch1/target/debug/deps/ch1-07d4929d340d9efb.d
Normal file
5
src/ch1/target/debug/deps/ch1-07d4929d340d9efb.d
Normal 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:
|
5
src/ch1/target/debug/deps/ch1-57fd53436cb557c8.d
Normal file
5
src/ch1/target/debug/deps/ch1-57fd53436cb557c8.d
Normal 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:
|
5
src/ch1/target/debug/deps/ch1-d2faebf0f4349873.d
Normal file
5
src/ch1/target/debug/deps/ch1-d2faebf0f4349873.d
Normal 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:
|
0
src/ch1/target/debug/deps/libch1-57fd53436cb557c8.rmeta
Normal file
0
src/ch1/target/debug/deps/libch1-57fd53436cb557c8.rmeta
Normal file
BIN
src/ch1/target/debug/deps/libmemchr-01dbc4587e7dba77.rlib
Normal file
BIN
src/ch1/target/debug/deps/libmemchr-01dbc4587e7dba77.rlib
Normal file
Binary file not shown.
BIN
src/ch1/target/debug/deps/libmemchr-01dbc4587e7dba77.rmeta
Normal file
BIN
src/ch1/target/debug/deps/libmemchr-01dbc4587e7dba77.rmeta
Normal file
Binary file not shown.
BIN
src/ch1/target/debug/deps/libmemchr-6c3f2604a168adfc.rmeta
Normal file
BIN
src/ch1/target/debug/deps/libmemchr-6c3f2604a168adfc.rmeta
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
src/ch1/target/debug/deps/libnom-2511ea9097602b48.rlib
Normal file
BIN
src/ch1/target/debug/deps/libnom-2511ea9097602b48.rlib
Normal file
Binary file not shown.
BIN
src/ch1/target/debug/deps/libnom-2511ea9097602b48.rmeta
Normal file
BIN
src/ch1/target/debug/deps/libnom-2511ea9097602b48.rmeta
Normal file
Binary file not shown.
BIN
src/ch1/target/debug/deps/libnom-2e36d95dbcef1226.rmeta
Normal file
BIN
src/ch1/target/debug/deps/libnom-2e36d95dbcef1226.rmeta
Normal file
Binary file not shown.
33
src/ch1/target/debug/deps/memchr-01dbc4587e7dba77.d
Normal file
33
src/ch1/target/debug/deps/memchr-01dbc4587e7dba77.d
Normal 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:
|
31
src/ch1/target/debug/deps/memchr-6c3f2604a168adfc.d
Normal file
31
src/ch1/target/debug/deps/memchr-6c3f2604a168adfc.d
Normal 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:
|
25
src/ch1/target/debug/deps/minimal_lexical-053a98cbe8ddf902.d
Normal file
25
src/ch1/target/debug/deps/minimal_lexical-053a98cbe8ddf902.d
Normal 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:
|
23
src/ch1/target/debug/deps/minimal_lexical-69d29d1e7f21ab28.d
Normal file
23
src/ch1/target/debug/deps/minimal_lexical-69d29d1e7f21ab28.d
Normal 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:
|
28
src/ch1/target/debug/deps/nom-2511ea9097602b48.d
Normal file
28
src/ch1/target/debug/deps/nom-2511ea9097602b48.d
Normal 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:
|
26
src/ch1/target/debug/deps/nom-2e36d95dbcef1226.d
Normal file
26
src/ch1/target/debug/deps/nom-2e36d95dbcef1226.d
Normal 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:
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue