簡體   English   中英

如何將帶有轉義序列的字符串轉換為C中的一個char

[英]How to convert string with escape sequence to one char in C

只是為了給你背景。 我們有一個學校項目,我們需要在C中編寫自己的編譯器。我的任務是編寫詞法分析。 到目前為止這么好,但我在逃脫序列方面遇到了一些困難。

當我找到轉義序列並且轉義序列是正確的時,我將它保存在一個看起來像這個\\ xAF的字符串中,否則它是詞法錯誤。

我的問題是如何將僅包含轉義序列的字符串轉換為一個char? 所以我可以將它添加到包含其余字符串的“緩沖區”中。

我對一個只包含轉義序列的大型表有一個想法,然后逐個比較,但它看起來並不優雅。

該解決方案可用於所有長度和類型的數字轉義序列,包括八進制,十六進制等。

當你看到'\\'時你所做'\\'就是檢查下一個字符。 如果它是'x' (或'X' ),那么你讀一個字符,如果它是一個十六進制數字( isxdigit ),那么你讀另一個字符。 如果last 不是十六進制數字,則將其放回流中(“unget”操作),並僅使用您讀取的第一個數字。

您讀取的每個數字都放入一個字符串,然后您可以使用例如strtol將該字符串轉換為數字。 將該數字直接放入令牌值。

對於八進制序列,最多只能有三個字符。


有關類似方法的示例,請參閱我多年前制作的這個老詞法 搜索lex_getescape函數。 雖然這種方法使用直接算法而不是strtoul將轉義碼轉換為數字,而不是標准的isxdigit等函數。

您可以使用以下代碼,使用您的字符串調用xString2char。

char x2char(const char c)
{
    if (c >= '0' && c <= '9')
        return c - '0';
    if (c >= 'a' && c <= 'f')
        return c - 'a';
    if (c >= 'A' && c <= 'F')
        return c - 'A';
    //if we got here it's an error - handle it as you like...
}

char xString2char(const char* buf)
{
    char ans;
    ans = x2char(buf[2]);
    ans <<= 4;
    ans += x2char(buf[3]);
    return ans;
}

這應該工作,只需添加錯誤檢查和處理(如果您還沒有在代碼中驗證它們)

flex有一個start條件。 這樣可以進行上下文分析。 例如,在flex手冊中有一個C注釋分析的例子(在/**/ ):

<INITIAL>"/*"   BEGIN(IN_COMMENT);
<IN_COMMENT>{
"*/"            BEGIN(INITIAL);
[^*\n]+         /* eat comment in chunks */
"*"             /* eat the lone star */
\n              yylineno++;
}

啟動條件還啟用字符串文字分析。 有一個如何在項目開始條件中使用開始條件匹配C風格引用字符串的示例,還有一個標題為"How do I expand backslash-escape sequences in C-style quoted strings?" FAQ項目"How do I expand backslash-escape sequences in C-style quoted strings?" 在flex手冊中。 可能這會回答你的問題。

暫無
暫無

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

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