Разбор строки в z / OS REXX с частичной нечувствительностью к регистру - PullRequest
1 голос
/ 05 июня 2019

У меня есть строка параметра REXX в этом формате:

arg = 'update summary(A summary of something) description(The description)'

, и я анализирую режим, сводку и описание следующим образом:

parse upper var arg mode . ,
   1, 'SUMMARY('summary')' .,
   1, 'DESCRIPTION('description')' .

Я конвертирую аргументв верхний регистр, так что ключевые слова SUMMARY и DESCRIPTION эффективно не чувствительны к регистру (пользователь может кодировать Summary или SUmmAry или sUmMaRy и т. д.), но теперь я только что перевел мое реальное резюме и описание в верхний регистр.

Как я могу сделать синтаксический анализ без учета регистра для ключевых слов, но сохранить правильный регистр для фактических параметров?

Я думал о том, чтобы извлечь позиции символов из ключевых слов и использовать их в выражении PARSE вместо '1' и т. Д., Но по возможности хочу простой и лаконичный процесс.

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Это довольно распространенная задача при моделировании синтаксиса TSO-ish / IDCAMS-ish в Rexx.Я обычно делаю что-то подобное.Это такая короткая идиома, я никогда не удосужился сделать из нее подпрограмму, просто используйте ее в строке.

summary = 'Whatever the default value is'
description = 'Whatever the default value is'
parse var arg mode arg
mode = upper(mode)
do while arg <> ''
    parse var arg keyword '(' value ')' arg
    select upper(keyword)
        when 'SUMMARY' then summary = value
        when 'DESCRIPTION' then description = value
        otherwise Say 'Unknown option:' keyword
    end
end
1 голос
/ 05 июня 2019

Я придумал эту функцию 'toUpper', которая немного проще, чем ожидалось.Он принимает строку и список слов в качестве входных данных и возвращает строку с любым из слов, преобразованных в верхний регистр, если он найден:

parms = 'UPdatE summary(The summary) Description(The description)'     
say 'Parms are :' parms                                                

parms = toUpper(parms, 'CHANGE UPDATE SUMMARY DESCRIPTION')            
say 'Parms are now :' parms                                            

exit                                                                   

/********************************************************************/ 
/* Subroutines                                                      */ 
/********************************************************************/ 
toUpper:                                                               

parse arg string, wordList                                             
stringUpper = string                                                   
upper stringUpper wordlist                                             

do i = 1 to words(wordlist)                                            
   word = word(wordlist,i)                                             
   pos = pos(word, stringUpper)                                        
   if pos > 0 then string = overlay(word, string, pos)                 
end                                                                    

return string 

Вывод:

Parms are : UPdatE summary(The summary) Description(The description)       
Parms are now : UPDATE SUMMARY(The summary) DESCRIPTION(The description) 
0 голосов
/ 16 июля 2019

Как указано, код Росса не будет работать в системе z / OS.REXX на z / OS немного древний.:-( Следующие коды будут работать.

summary = 'Whatever the default value is'                           
description = 'Whatever the default value is'                       
arg =  'UPdatE summary(The summary) Description(The description)'   
parse var arg mode arg                                              
upper mode                                                          
do while arg <> ''                                                  
    parse var arg keyword '(' value ')' arg                         
    upper keyword                                                   
    select                                                          
        when keyword='SUMMARY' then summary = value                 
        when keyword='DESCRIPTION' then description = value         
        otherwise Say 'Unknown option:' keyword                     
    end                                                             
end                                                                 
...