Shell 输入独立于空间实现
Shell Input Independent of Spaces Implementation
我最近有一个编程 class,我们在 Java 中实现了一个 shell。其中一项要求是确保可以从终端读取参数,而不管它们之间的空格和制表符等,除非在引号内,引号内的所有内容都按原样使用。
为了解决这个问题,我编写了一个正则表达式并使用流将结果放入数组中以供进一步处理。
但是现在在准备系统编程课程时我意识到必须有更简单的方法来做到这一点?这是如何在像 bash 这样的典型 shell 中实现的?
它只是逐个字符地读取流并在遇到引号时跳过直到找到匹配的引号吗?
对于 bash(可能还有任何其他现代 shell),它比这复杂得多。请参阅 bash 源代码中的 this function,用于解析匹配的字符对(引号、大括号等)。它非常复杂,因为有许多不同类型的引号、圆括号和大括号('
、{
、(
、"
、'
、... ) 并且涉及很多边缘情况。例如,在这种情况下,跳过字符直到看到另一个引号是行不通的,因为可以嵌套:
echo "`echo "hello"`"
我不知道您在 class 中实现的 shell 程序的要求,但如果它不包含此类嵌套结构,那么我相信像您这样的简单方法提到的可以用。
对于复杂的语法(bash 标记可能很复杂),最好使用 parser/generator 工具,而不是从头开始实现逻辑。使用 RE,可能会涵盖一些语法,但不太可能涵盖复杂的规则集。
根据限制条件(编程语言等),考虑两种选择:
- 使用flex/bison进行标记解析和语法解析,或
- 使用脚本引擎(Python、Perl、JavaScript),同时具有RE和强大的字符串处理能力。
我最近有一个编程 class,我们在 Java 中实现了一个 shell。其中一项要求是确保可以从终端读取参数,而不管它们之间的空格和制表符等,除非在引号内,引号内的所有内容都按原样使用。
为了解决这个问题,我编写了一个正则表达式并使用流将结果放入数组中以供进一步处理。
但是现在在准备系统编程课程时我意识到必须有更简单的方法来做到这一点?这是如何在像 bash 这样的典型 shell 中实现的?
它只是逐个字符地读取流并在遇到引号时跳过直到找到匹配的引号吗?
对于 bash(可能还有任何其他现代 shell),它比这复杂得多。请参阅 bash 源代码中的 this function,用于解析匹配的字符对(引号、大括号等)。它非常复杂,因为有许多不同类型的引号、圆括号和大括号('
、{
、(
、"
、'
、... ) 并且涉及很多边缘情况。例如,在这种情况下,跳过字符直到看到另一个引号是行不通的,因为可以嵌套:
echo "`echo "hello"`"
我不知道您在 class 中实现的 shell 程序的要求,但如果它不包含此类嵌套结构,那么我相信像您这样的简单方法提到的可以用。
对于复杂的语法(bash 标记可能很复杂),最好使用 parser/generator 工具,而不是从头开始实现逻辑。使用 RE,可能会涵盖一些语法,但不太可能涵盖复杂的规则集。
根据限制条件(编程语言等),考虑两种选择:
- 使用flex/bison进行标记解析和语法解析,或
- 使用脚本引擎(Python、Perl、JavaScript),同时具有RE和强大的字符串处理能力。