标记可能是元组或其他内容的字符串

Tokenizing a string that could be a tuple or something else

我正在为一种基本的编程语言构建一个词法分析器(分词器)和一个解析器,我正在考虑的语言功能之一是将字符串解析为元组或表达式的选项。问题是我坚持如何从一个字符串中确定它是否应该是一个元组。起初,我以为我可以只检查字符串是否以“(”开头并以“)”结尾以及是否在内部某处包含“,”,但该方法的问题是表达式也可以包含元组。

是否有规范或公认的方法来判断字符串是否为元组?

词法分析器无法确定 ( 是否是元组的一部分。它只识别 (。这就是它所要做的。

确定特定符号的含义是解析器的工作。解析器将使用语言的语法描述来区分元组、带括号的表达式、参数列表以及括号的所有其他可能含义。

当然,精确的语法取决于语言的语法,但一个简单的例子可能是:(大致改编自 Python,但缺少很多语法)

expr  : term             /* Additive operators, lowest precedence */
      | expr '+' term
      | expr '-' term
term  : factor           /* Multiplicative operators */
      | term '*' factor
      | term '/' factor
factor: postfix          /* Unary prefix operators */
      | '-' factor
      | '+' factor
post  : unit             /* Postfix operators: call and subscript */
      | post '(' opt_expr_list ')'
      | postfix '[' expr ']'
unit  : CONSTANT         /* Values */
      | IDENTIFIER
      | tuple
      | '(' expr ')'     /* Parenthesised expression */
tuple : '(' ')'          /* Empty tuple */
      | '(' expr ',' ')' /* Single-element tuple eg. (1, ) */
      | '(' expr ',' expr_list opt_comma ')'
                         /* Two or more elements */
opt_comma
      : %empty
      | ','
expr_list
      : expr
      | expr_list ',' expr
opt_expr_list
      : %empty
      | expr_list

请注意,语法经过精心设计,可以将元组与带括号的表达式区分开来。使用的约定是元组 可以 在最后一个元素后写一个 , 除非元组只有一个元素,在这种情况下逗号是必需的。这稍微需要将元组的语法分解为三个产生式,但并不特别复杂。

另请注意,在描述函数调用的语法时,没有必要跳过这个特定的环节。不可能将 sin(3) 中的 (3) 与带括号的表达式混淆,因为带括号的表达式(与其他值一样)不能在没有某种运算符的情况下立即跟在表达式之后。