标记可能是元组或其他内容的字符串
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)
与带括号的表达式混淆,因为带括号的表达式(与其他值一样)不能在没有某种运算符的情况下立即跟在表达式之后。
我正在为一种基本的编程语言构建一个词法分析器(分词器)和一个解析器,我正在考虑的语言功能之一是将字符串解析为元组或表达式的选项。问题是我坚持如何从一个字符串中确定它是否应该是一个元组。起初,我以为我可以只检查字符串是否以“(”开头并以“)”结尾以及是否在内部某处包含“,”,但该方法的问题是表达式也可以包含元组。
是否有规范或公认的方法来判断字符串是否为元组?
词法分析器无法确定 (
是否是元组的一部分。它只识别 (
。这就是它所要做的。
确定特定符号的含义是解析器的工作。解析器将使用语言的语法描述来区分元组、带括号的表达式、参数列表以及括号的所有其他可能含义。
当然,精确的语法取决于语言的语法,但一个简单的例子可能是:(大致改编自 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)
与带括号的表达式混淆,因为带括号的表达式(与其他值一样)不能在没有某种运算符的情况下立即跟在表达式之后。