词法分析

词法分析把源代码转换成单词流。

词法部分与正则文法相对应,读取前缀几个字符就可以区分是什么单词。
特别设计时会让词法分析变得简单。如:变量名不能是数字开头的,这样读到数字,就知道后面是number常量,而不是变量名。

经过设计后,手写词法分析会很简单。lua的词法分析部分伪代码

function Lex()
    local _char = CurrentChar()
    if IsDigit(_char) then
        return [读取数字常量]
    elseif IsLetter(_char) or _char == '_' then
        local name = [读取标识符]
        if IsReserveKey(name) then
            return [确定是什么类型的保留字,一般用个hash表存起来]
        else
            return [name是变量名]
    elseif _char == '\"' or _char == '\'' then
        return [读取字符串常量]
    elseif _char == '>' then
        // 这里需要看两个字符才能确定后面是什么单词
        _char = NextChar()
        if _char == '=' then
            return [大于等于]
        else
            return [大于]
    [elseif ...]
    elseif [_char是单字符运算符,如+*%] then
        return [单字符token]
    elseif [_char是空白符] then
        NextChar() // 跳过
        return Lex()
    end
end

php的词法分析的特殊处理

词法分析一般是无状态的,没有上下文依赖。读去下一个单词,不需要知道上一个单词是什么。
但是php的字符串比较特殊。
php支持很方便的字符串连接语法,使用起来和字符串替换类似。如$name = "我"; echo "i am $name"
这里的"i am $name"是两个单词,在读到$name时就需要知道当前是不是在处理字符串连接。这个状态是需要词法分析区分保存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 词法分析器 词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号(Toke...
    435fa00b72e7阅读 1,638评论 0 3
  • 词法分析器的任务: 读入每个单词或者字符 判断每个字符或者单词是否合法 如果所有字符或者单词合法,则为每个单词或字...
    拉丁吴阅读 7,921评论 0 8
  • 写在前面 从源代码到可执行文件要经历几个过程: 词法分析 语法分析 语义分析 中间代码生成 代码优化 词法分析有点...
    wsztrush阅读 2,049评论 0 5
  • 前言 前言:词法分析和语法分析部分的设计,和在实际编程过程中,编译期的语法检查和相关的错误提示是息息相关的此篇可以...
    sea_biscute阅读 9,305评论 0 6
  • 设备:佳能700d 参数:iso200-400 白平衡:阴天 廉村位于福建宁德福安市溪潭镇。廉村原名石矶津,是唐...
    墨不尽阅读 363评论 1 1