编程语言中的保留关键字

时间:2012-04-15 23:50:30

标签: compiler-construction programming-languages keyword

我想知道所有编程语言是否保留关键词? IfWhile是保留的关键词。如果我If = 3是非法的,我们不应该将它用作普通变量或函数名称。因此编译器将在sanner阶段产生错误。如果语言允许程序员使用保留关键字说{​​{1}}作为变量名称或函数名称,该怎么办?编译器如何处理这个问题?这是否在扫描仪或解析器中处理?语义分析应该做什么?

更新 我理解这不是一个好习惯,但大多数/所有编程语言不支持这个的真正原因是因为扫描程序或解析器不能精确地扫描语言或解析语言或者它背后的真实情况是什么?谢谢。

6 个答案:

答案 0 :(得分:5)

你绝对可以做这样的事情,但显然它会破坏源代码的直观性。想象一下:

if if == 1

就实际实现它而言,词法分析器根本不需要改变。如果词法分析器匹配源中的“if”,则返回具有IF类型的标记。假设我们有以下赋值语句,其中if是变量名,并且它被赋值为1.

if <- 1;

要提供给解析器的词法分析器标量流是:

IF, LARROW, INTLITERAL, SEMICOLON

我可能有以下产品来描述赋值语句(\ w整数rvals):

assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}

LARROWIDIFINTLITERALSEMICOLON是终结者,是词法分析器返回的令牌,assignStmtidintExpr是非终端。 ID表示标识符(例如,类/变量/方法名称)。

if语句的生产失败后,我们最终会输入作业语句的第一个作品。我们展开了id非终端,其唯一产量为ID,但我要匹配的令牌为IF,因此assignStmt生产完全失败。

我的语言允许将变量命名为“if”,我所要做的就是:

assignStmt::= id:i LARROW intExpr:e SEMICOLON {: RESULT = new AssignmentStatement(i, e) :}
intExpr::= INTLITERAL:i {: RESULT = i.intVal; :}
id::= ID:i {: RESULT = i.strVal; :}
     |IF {: RESULT = "if"; :}

请注意,|定义了非终端的替代产品。现在我们为id非终端进行了第二次生成,它与当前令牌匹配,最终导致匹配赋值语句。

AssignmentStatement是AST节点,定义如下:

class AssignmentStatement {
     String varName;
     int intVal;
     AssignmentStatement(String s, int i){varName = s; intVal = i; }
}

一旦解析器确定源语法正确,就不会有任何其他因素受到影响。变量的名称不应影响编译的后期阶段,即如果您不创建允许这种情况发生的条件。

答案 1 :(得分:1)

即使你可以,你为什么要这样做呢?

它能做的就是为不可维护的代码做准备。

if (a==b) - 是一个if表达式还是对函数if的调用传递一个布尔arg?

我会说如果有任何语言让你这样做,那么3个用户可能会有一些奇怪的学术问题。

[穿上石棉内衣以准备3名使用者的无情燃烧; - )]

答案 2 :(得分:1)

编程语言倾向于保留单词,因为人们喜欢将词法扫描程序放在解析器前面。词汇扫描程序会将源代码转换为一系列标记,因此您最终可能会得到“&gt;&gt;”令牌并说所有这些令牌都是移位运算符,然后你不能将这些字符用于其他任何东西,除非作为其他令牌的一部分(如带引号的字符串),这是或曾经是C ++的流行问题。其他单词如“if”是相同的,它被转换为某种“if”标记,并且只要解析器看到“if”标记,它就会将其视为某些条件结构的第一部分。另一个例子是JavaScript,你可以写

JSON.stringify({栏:2})

但你不能写

JSON.stringify({VAR:2})

因为“var”是一个“var”标记,但“bar”只是一个像其他标记一样的标识符。

答案 3 :(得分:0)

好吧,我没想到没有保留关键字的任何编译语言;它更加方便,并且很少有充分的理由使用这些保留的关键字('if'不是一个好的变量名称)。

在PHP中,变量以美元符号开头使用,所以我认为一种语言可以这样实现(使用非字母为变量添加前缀,因此你可以使用$ if)。我想这可以起作用,尽管这样做没有多大用处。

答案 4 :(得分:0)

允许任意关键字的一种方法是对所有非标识符语法变量使用非字母符号。 APL采用这种方法,可以说Smalltalk也是如此(在Smalltalk-80中,有六个保留字,但它们都具有类似变量的语义;通常是关键字的东西,如条件,在语法上是规则的消息)。

答案 5 :(得分:-1)

我认为不存在任何此类语言。 所有信息语言都基于语法,即一组说明必须如何构造代码的规则。这样,您就可以证明代码在结构上是有效的。 如果您允许根据需要切换名称,则必须有一种“动态”更改语法的方法,以确保代码的验证保持正确。

在更实际的层面上,为什么还要做这样的事情呢?保留关键字有什么问题?它们非常有用,至少每个人都以同样的方式说同一种语言。 你甚至不会用现实世界的语言来思考这样的事情......想象一下,如果你开始切换单词的意思!没有人会理解任何事情!!