簡體   English   中英

Rust的語法語法是無上下文還是上下文敏感?

[英]Is Rust's syntactical grammar context-free or context-sensitive?

幾乎沒有任何編程語言的語法語法是規則的,因為它們允許任意深度嵌套的括號。 Rust也是這樣做的:

let x = ((((()))));

但Rust的語法語法至少是無上下文的嗎? 如果不是,哪個元素使語法上下文敏感? 或者語法甚至是遞歸可枚舉的,就像C ++的語法語法一樣


相關Rust的詞匯語法是常規的,無上下文的還是上下文敏感的?

Rust包含一個宏處理器,其操作具有高度上下文相關性。

你可以嘗試通過語法分析來解決這個問題,但不包括宏擴展 - 可能,但不是特別有用 - 或者假設宏擴展是由一些中間工具完成的,它給了一個免費的傳遞給你讓它成為圖靈完整的。

但我傾向於說它只是意味着Rust語言是遞歸可枚舉的。

宏定義的有效性存在許多限制,這可能會使語言(至少)對上下文敏感,即使您決定不執行宏擴展作為語法分析的一部分。

這並不意味着無上下文語法不能用作Rust語法分析的一部分。 它可能是必不可少的,使用諸如bison或Antlr之類的解析器生成器(以及兩者的示例)甚至可能是有用的。 像大多數編程語言一樣,有一個簡單的Rust超集,它是無上下文的,可以使用無上下文語法工具進行有用的分析; 但是,最終有些文本需要在編譯時被拒絕為無效,即使它們是CF超集的一部分。

直接從Rust的源代碼中回答:

Rust的詞法語法不是無上下文的。 原始字符串文字是問題的根源。 非正式地,原始字符串文字是r,后跟N個哈希(其中N可以為零),引號,任何字符,然后引用后跟N個哈希。 關鍵的是,一旦進入第一對報價,另一個報價就不能跟隨N個連續的哈希值。 例如r ###“”###“###無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM