【问题标题】:Lexing/tokenization delimited strings词法分析/标记化分隔字符串
【发布时间】:2020-11-03 02:05:51
【问题描述】:

我正在为一种小型语言编写一个手写词法分析器,但有一个奇怪的要求,我不知道如何处理。

我需要能够支持分隔字符串的概念,其中分隔符可以是任何字符。例如。字符串最有可能使用双引号分隔(例如"hello"),但也可以很容易地使用/hello/,hello,

例如。一些示例输入行可能是:

x = /abc/
y = "abc" + ,def,
z = zabcz

最后一种情况有点病态,但在技术上是可行的。

在一般情况下,我正在尝试在标记化阶段是否有任何方法可以做到这一点?任何想法或建议都会很棒。

【问题讨论】:

    标签: tokenize lexer


    【解决方案1】:

    这里是 c++ 和 js 中的解决方案。

    c++

    #include "vector"
    #include "string"
    #include "iostream"
    using namespace std;
    // Lexically Analyze method
    auto lex_argument(string code){
    // Define variables
    size_t equal_location;
    int counter = 0;
    auto variable;
    string variable_name;
    auto variable_info[2]
    string code_for_inspection;
    /* In the case of a variable , these two characters will hold the beginning and end of the string */
    char string_variable_characters[2];
    equal_location = code.find("=",0,code.length());
    variable_value = code.substr(equal_location + 2,code.length());
    variable_name = code.substr(code.begin(),equal_location - 2);
    variable_info[0] = variable_name;
    string_variable_characters[0] = (char) variable_value.substr(0,1);
    string_variable_characters[1] = (char) 
    variable_value.substr(variable_value.length() - 1,variable_value.length());
    if(string_variable_charecters[0] = string_variable_charecters[1]){
    variable_name.erase(0,1);
    variable_value.erase(variable_value.length() - 1,variable_value.length());
    variable_info[1] = variable_value;
    }
    return variable_info;
    }
    

    在js中:

    function lex_argument(code){
    var equalLocation = code.search("=");
    var variableInfo = [null,null];
    variableInfo[1] = code.substr(1,equalLocation - 2);
    variableInfo[0] = code.substr(equalLocation,code.length);
    string_delimeters = [variableInfo[0].substr(1,2),variableInfo[0].substr(variableInfo[0].length - 1,variableInfo[0].length];
    return variableInfo;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多