【问题标题】:Lexical, Syntactical, or Semantic Error differences in JavaJava 中的词法、句法或语义错误差异
【发布时间】:2014-07-24 15:52:02
【问题描述】:

我正在练习词汇、句法和语义上的差异(使用 Java 语言)。对于下面的集合,我想确定它们是否是词汇、句法或语义错误。只是想确保我做得对,并希望得到一些反馈。

a) double if;             Syntactical Error
b) doif (1 ==1);          Syntactical Error
c) x12 = “x12”;           Semantic Error
d) int double = 1.0;      Syntactical Error
e) 0-;                    Syntactical Error
f) int a = 09 – 90;       Syntactical Error
g) int $10 = 10;          No Error
h) char $dollar = ‘$’;    No Error

我觉得我在最后两个中遗漏了一些东西。虽然我使用 Eclipse 进行了检查,但它没有显示任何错误。真的“没有错误”吗?

【问题讨论】:

  • b) 如果您在某处定义了一个名为 doif 的函数,该函数采用布尔值
  • 你能解释一下为什么你的代码中的 a) 有语法错误吗?根据我的理解,语法分析器无法确定令牌是否有效。

标签: java syntax semantics lexical-analysis


【解决方案1】:

int a = 09-90;

词法错误 八进制数从零开始,可以使用 0-7 之间的数字。因此,09 既不是八进制也不是整数。因此,它不是 JAVA 中的 Token。而且,在 java 中任何不是标记的东西都会出现词法错误。

doif (1 ==1);

语义错误 doif 是一个完美的标识符(函数名),我们在这里传递它 (1==1),它是 TRUE 值。因此,此示例遵循“函数调用”的语法。但是,这里的问题是 doif 函数在使用之前没有定义。未初始化的标识符使用会导致语义错误。因此,给定的示例是一种语义错误。

【讨论】:

    【解决方案2】:

    “没有错误”确实是正确的。美元符号 is permissible in -- including at the start of -- Java identifiers(尽管 JLS 建议它仅用于机械生成的代码或访问遗留系统上预先存在的名称)。

    【讨论】:

      【解决方案3】:

      对于任何语言,词法、句法或语义错误可能如下所示

      词法分析 - 检查所有标记是否存在于一种语言中。 例如 foo a=1; foo 不是 java 中的标记/关键字,所以词法错误。

      语法分析 - 检查所有语句是否符合语法规则。 例如int 1a=0; 没有词法错误,但有句法错误。 不遵循命名标识符的语法规则。

      语义分析 - 检查该语句是否有意义。 例如int a=1/0; 没有词汇、句法错误,但语义错误。 因为除零是不可能的。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        相关资源
        最近更新 更多