EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则 假定有语法类 <exp> 表示一般表达式,<s-exp> 表示可用于 switch 标号的静态表达式 查阅 javascript语言的规范,尽可能保证你的描述反映了javascript语言规范的要求 请说明javascript程序的哪些结构要求没有在你的描述中反映出来?如果有,请说明为什么无法描述。
语句 <statement> ::= block | <variable-statement> |<assignment-statement> |<labeled-statement> | <expression-statement> | <condition-statement> | <iteration-statement> | <jump-statement> |<with-statement> |<exception-statement> |<throw-statement> |<empty-statement>
2.语句块 block ::= ‘{’[<statement-list>]'}' statement-list ::= <statement>{<statement>} 3.变量声明 variable-statement ::= 'var '<variable-declaration-list>[';'] variable-declaration-list ::= <variable-declaration> {','<variable-declaration>} variable-declaration ::= <identifier>['='<exp>] 4.赋值语句 assignment-statement ::= <identifier> ' =' <exp>[';']
5.带标签语句 label-statement ::= <identifier> : <statement> | 'case' <s-exp> : <statement> | 'default : '<statement> 6.表达式语句 expression-statement ::= <exp> 7.条件语句 condition-statement ::= 'if ( '<exp> ') '<statement> | 'if ( '<exp>' ) '<statement> 'else '<statement> | 'switch ( '<exp> ') '<statement> 8.循环语句 iteration-statement ::= 'while ( '<exp> ') '<statement> | 'do' <statement> 'while (' <exp> ')' [';'] | 'for ( '[<identifier> ' =' <exp>]';'[<exp>]';' {<exp>] ')' <statement>
9.跳转语句 jump-statement ::= 'continue '[';']' | 'break' [<identifier>][';'] | 'return' [<exp>][';'] 10.with语句 with-statement ::= with '('<exp>')' <statement> 11.异常语句 exception-statement ::= 'try' <block>'catch' '(' <identifier>')' <block>['finally'<block>] 12.throw语句 throw-statement::= 'throw'<exp>[;] 12.空语句 empty-statement ::=';'
操作语义 1.赋值语句 2.if语句 3.while语句
4.do-while语句 5.for语句 初始化: 判断循环条件:
6.continue语句(跳过循环体的后部分) 7.break语句(跳出循环体) 8.return语句
9.with语句 10.异常语句 11.空语句
堆栈帧存储与参数机制 2. 画出以下程序运行过程的堆栈存储状态 class A { 2. 画出以下程序运行过程的堆栈存储状态 class A { public static void main(String[] args) String str1="aaa"; String str2="bbb"; method1(str1,str2); System.out.println(str1+"\t"+str2); StringBuffer sb1=new StringBuffer("aaa"); StringBuffer sb2=new StringBuffer("bbb"); method2(sb1,sb2); System.out.println(sb1+"\t"+sb2); } static void method1(String str1,String str2) str1+="ccc";str2="aaa"; static void method2(StringBuffer sb1,StringBuffer sb2) sb1.append("ccc"); sb2=new StringBuffer("aaa");
调用method1前 String str1="aaa";String str2="bbb"; Java栈 main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 方法区 Class A 类型信息 aaa 常量池 (用于保存在编译期已确定的,已编译的class文件中的一份数据。 程序中有三个字符串常量aaa,bbb,ccc将被创建) bbb ccc 堆区
进入method1(传值调用) Java栈 方法区 main参数args main返回地址 Class A 类型信息 main动态链 aaa str1 str2 method1参数str2 method1参数str1 method1返回地址 method1动态连 method1静态连 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区
执行method1(传值调用) str1+="ccc";str2="aaa"; Java栈 main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 method1参数str2 method1参数str1 method1返回地址 method1动态连 method1静态连 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区 aaaccc (在执行时确定)
执行method2前(引用调用) StringBuffer sb1=new StringBuffer("aaa"); StringBuffer sb2=new StringBuffer("bbb"); Java栈 main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 sb1 sb2 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区 aaaccc aaa bbb
进入method2(引用调用) Java栈 方法区 Class A 类型信息 aaa 常量池 堆区 bbb aaaccc ccc aaa main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 sb1 sb2 method2参数sb2 method2参数sb1 method2返回地址 method2动态链 method2静态链 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区 aaaccc aaa bbb
执行method2(引用调用) sb1.append("ccc"); sb2=new StringBuffer("aaa"); Java栈 main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 sb1 sb2 method2参数sb2 method2参数sb1 method2返回地址 method2动态链 method2静态链 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区 aaaccc bbb aaa
执行method2后(引用调用) Java栈 方法区 Class A 类型信息 aaa 常量池 堆区 bbb aaaccc ccc bbb main参数args main返回地址 main动态链 main静态链 main返回值 str1 str2 sb1 sb2 方法区 Class A 类型信息 aaa 常量池 bbb ccc 堆区 aaaccc bbb aaa
欢迎大家提出质疑并交流。 谢谢!