Lex匹配unicode字符

想用lex&yacc写一个json的解析, 而json的string类型是包含unicode的, 词法解析工具Lex是不直接支持unicode字符匹配的, 那如果要想匹配unicode字符应该怎么办呢, 在stack overflow上看到一个很好的解答: http://stackoverflow.com/questions/9611682/flexlexer-support-for-unicode.

基本思想就是unicode字符写一个匹配模式,

ASC     [\x00-\x7f]
ASCN    [\x00-\t\v-\x7f]
U       [\x80-\xbf]
U2      [\xc2-\xdf]
U3      [\xe0-\xef]
U4      [\xf0-\xf4]

UANY    {ASC}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UANYN   {ASCN}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UONLY   {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}

上面匹配模式的意义如下:

UANY: 匹配unicode和ascii字符

UANYN: 与UANY类似, 只是不匹配换行符

UONLY: 只匹配unicode字符, 不匹配ascii字符

DISCLAIMER: Note that the scanner’s rules use a function called

utf8_dup_from to convert the yytext to wide character strings

containing Unicode codepoints. That function is robust; it detects

problems like overlong sequences and invalid bytes and properly

handles them. I.e. this program is not relying on these lex rules to

do the validation and conversion, just to do the basic lexical

recognition. These rules will recognize an overlong form (like an

ASCII code encoded using several bytes) as valid syntax, but the

conversion function will treat them properly. In any case, I don’t

expect UTF-8 related security issues in the program source code, since

you have to trust source code to be running it anyway (but data

handled by the program may not be trusted!) If you’re writing a

scanner for untrusted UTF-8 data, take care!

时间: 2024-12-09 02:44:08

Lex匹配unicode字符的相关文章

正则表达式入门(六)匹配unicode和其他字符

匹配unicode字符有时候我们需要匹配ASCII范围之外的字符. "Qu'est-ce que la tolérance? c'est l'apanage de l'humanité. Nous sommes tous pétris de faiblesses et d'erreurs; pardonnons-nous réciproquement nos sottises, c'est la première loi de la nature." -Voltaire (1694–1

decode 函数将字符串从某种编码转为 unicode 字符

环境:Ubuntu, Python 2.7 基础知识 这个程序涉及到的知识点有几个,在这里列出来,不详细讲,有疑问的直接百度会有一堆的. 1.urllib2 模块的 request 对像来设置 HTTP 请求,包括抓取的 url,和伪装浏览器的代理.然后就是 urlopen 和 read 方法,都很好理解. 2.chardet 模块,用于检测网页的编码.在网页上抓取数据很容易遇到乱码的问题,为了判断网页是 gtk 编码还是 utf-8 ,所以用 chardet 的 detect 函数进行检测.没

ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度

一.match() 1.定义 match()方法用于检索字符串内指定(字符串或正则)的值,返回指定值的数组,若找不到,返回null. 2.语法 str.match(searchvalue) str.match(regexp) 3.示例 let str = 'abc-def-zxc'; console.log(str.match('-')); // ["-", index: 3, input: "abc-def-zxc"] console.log(str.match(

在2005年,Unicode 的第十万个字符被采纳且认可成为标准之一(超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现)

在计算机科学领域中,Unicode(统一码.万国码.单一码.标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统.Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式[1]对外发表.Unicode 还不断在扩增, 每个新版本插入更多新的字符.直至目前为止的第六版,Unicode 就已经包含了超过十万个字符(在2005年,Unicode 的第十万个字符被采纳且认可成为标准之一).一组可用以作为视觉参考的代码图表.

C# 中文和UNICODE字符转换方法

这个方式其实很多见,特别是使用Json的时候用的比较多,其实也很简单主要是使用了ToString("x")方法直接看代码吧 string str = "大家好我是小哲"; string outStr = ""; if (!string.IsNullOrEmpty(str)) { for (int i = 0; i < str.Length; i++) { //将中文字符转为10进制整数,然后转为16进制unicode字符 outStr +=

正则表达式匹配 任意字符和空格的一个简便方式?

这里主要讲的是 \s.\S的配合使用, 一般我们匹配任意字符想到的是 ".",但是如果要匹配换行符尼?显然是行不通的,那我们怎么办尼? 那直接用 "[.\n]"来解决吧! 但是往往结局是残酷的,由于两个不合丫!所以这种方式也行不通:那只好想其他的方式咯! 如下 例如我们要匹配一个网页中的 <html> <head> <STYLE> P{ color:red; } h1{ color:blue; } </STYLE> &

字符和字符串处理-ANSI字符和Unicode字符

我们知道,C语言用char数据类型表示一个8位的ANSI字符,默认在代码中声明一个字符串时,C编译器会把字符串中的字符转换成由8位char数据类型构成的一个数组: // An 8-bit character char c = 'A'; // An array of 99 8-bit character and 8-bit terminating zero char szBuffer[100] = "A String"; Microsoft的C/C++编译器定义了一个内建的数据类型wch

python print输出unicode字符

命令行提示符下,python print输出unicode字符时出现以下 UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb 不能输出 unicode 字符,程序中断. 解决方法: sys.stdout = io.TextIOWrapper(sys.stdout.buffer, errors = 'replace', line_buffering = True) python print输出unicode字符,布布扣,bu

[\u4e00-\u9fa5] //匹配中文字符

[\u4e00-\u9fa5] //匹配中文字符 ^[1-9]\d*$    //匹配正整数^[A-Za-z]+$   //匹配由26个英文字母组成的字符串^[A-Z]+$      //匹配由26个英文字母的大写组成的字符串^[a-z]+$      //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串 [\u4e00-\u9fa5] //匹配中文字符,布布扣,bubuko.com