• 敏
    2019-11-01
    老师,您好。语义分析有没有工具可以使用?

    另外,对于C语言的语义分析,都需要分析哪些内容?有没有一个列表?(我想实现一个C语言的前端)

    作者回复: 没有工具。原因:
    语义分析的工作比较多,作用域解析、类型检查等等,比较难以统一解决。
    而每个语言的个性化差异,最大的就体现在语义方面。词法差异最小,语法次之,语义差异最大。语法差异再大,但都可以用CFG表示,所有都可以统一地解决。但语义的差异,目前还不好用统一的形式化的方法去解决。
    比如类型系统,每种语言的设计相差很大,很难用统一的方式来处理。
    属性文法是语义分析领域从形式化的角度做得不错的工作了,所以可以基于属性文法实现一些自动的工作。

    
     4
  • 沉淀的梦想
    2019-09-09
    @Override
        public Object visitPrimary(PrimaryContext ctx) {
            Object rtn = null;
            //字面量
            if (ctx.literal() != null) {
                rtn = visitLiteral(ctx.literal());
            }
            //变量
            else if (ctx.IDENTIFIER() != null) {
                Symbol symbol = at.symbolOfNode.get(ctx);
                if (symbol instanceof Variable) {
                    rtn = getLValue((Variable) symbol);
                } else if (symbol instanceof Function) {
                    FunctionObject obj = new FunctionObject((Function) symbol);
                    rtn = obj;
                }
            }
            //...

    读了一下老师的visitPrimary方法,感觉对于变量,返回的全部都是左值啊?老师的代码是在哪里进行左值和右值的区分的呢?
    展开

    作者回复: 是的。你看得很细:-)
    我这里是偷懒了。因为左值比右值更强,所以我在示例代码里都用的是左值。
    我抽空会在语义分析中加上左右值分析的代码:-)

    
     2
  • Geek_54edc1
    2020-01-16
    老师请教个问题,c++模板与泛型编程在语义上怎样处理的呢?

    作者回复: C++的模板与泛型编程是一种元编程技术,就叫做模板元编程,是C++最强大的能力之一。
    在第38讲,我们提到了元编程的基础知识。简单的来说,它是在编译期由程序生成另外的程序。
    具体到C++的模板元编程技术,它会在编译期把模板展开,比如把某个数据类型替换成真实的类型,然后再进一步编译所形成的代码。
    模板元编程技术能够让编写类库等任务变得更简单。代价是编译期的计算量变大,编译时间变长。
    另外注意,C++的泛型跟Java的泛型机制是不一样的。Java的泛型比较简单,只是做类型检查,没有做新代码的生成。

     1
     1
  • Geek_54edc1
    2020-01-16
    public、protected、private等访问控制,也是在语义分析阶段处理的

    作者回复: 是的。语义分析时会去做检查。

    
    
我们在线,来聊聊吧