Ответ 1
Я считаю, что это должно сделать трюк (новые строки добавлены только для ясности и удаления дополнительных кавычек):
dmd '-od"bin"' '-of"bin\convHull.exe"' '-I"src"'
src\concSort.d src\fileParser.d src\main.d src\pointLogic.d src\quickHull.d src\stupidHull.d
-D -O -release
Обратите внимание, что в случае, когда кавычка (") должна быть передана как часть самого аргумента, я окружил весь аргумент одинарными кавычками ('). Из приведенного ниже эксперимента видно, что только -of"..."
нужны цитаты об этом.
Счастливое кодирование.
Я не могу найти хорошую ссылку на это точное производство, однако обратите внимание на следующие синтаксические разборки:
-x"w." -> error: " expected (last " is special) -x"w."" -> -x"w and ."" (the . starts a new token and the " in that starts a quote; however, the quotes are not removed) '-x"w."' -> -x"w." (extra quote fine, neither special) -x"w" -> -x"w" (no . and " not special) -x"w"" -> -x"w"" (no . and " not special) a".b" -> a.b (didn't start with `-`, quotes removed) a".b -> error: " expected (" is special)
Таким образом, похоже, что это как-то связано с комбинацией .
и -
(и это может быть не эксклюзивным). Из вышеизложенного я считаю, что токен, начинающийся с -
, не включает символ .
в качестве допустимого символа в токене, поэтому лексер завершает указанный токен и запускает новый токен - легко доказуемый с хорошей ссылкой EBNF, которая У меня нет.
Лучшее, что я могу найти, это Приложение C: Грамматика PowerShell:
Правило ParameterToken используется для сопоставления параметров командлета, таких как -foo или - boolProp:. Обратите внимание, что это правило также будет соответствовать - foobar, поэтому это правило имеет для проверки перед правилом --token.
<ParameterToken> = -[:letter:]+[:]{0 |1}
Однако это в лучшем случае неполное и даже не включает определение "буквы".