[英]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.