Взгляните на стандартный модуль shlex и измените одну копию его для соответствия синтаксису, который Вы используете для своей оболочки, это - хорошая начальная точка
, Если Вы хотите все питание полного решения для lexing/parsing, , ANTLR может генерировать Python также.
Это быстрее на старых компиляторах, которые не оптимизируют вызовы * 2 путем выдачи инструкции сдвига влево. Эту оптимизацию действительно легко обнаружить, и любой достойный компилятор уже делает это.
Если она влияет на удобочитаемость, не используйте ее. Всегда сначала пишите свой код максимально ясным и кратким образом, а затем, если у вас есть проблемы со скоростью, вернитесь, профилируйте и выполните ручную оптимизацию.
Вы должны использовать * при умножении и << при битовом сдвиге. Они математически эквивалентны, но имеют разное семантическое значение. Например, если вы создаете поле флага, используйте битовый сдвиг. Если вы подсчитываете сумму, используйте умножение.
Он используется, когда вас интересуют отдельные биты данных, с которыми вы работаете. Например, если вы хотите установить старший байт слова равным 0x9A
, вы не должны писать
n |= 0x9A * 256
. Вы должны написать:
n |= 0x9A << 8
Это проясняет, что вы работаете с битами, а не данные, которые они представляют.
Для некоторых архитектур сдвиг битов выполняется быстрее, чем умножение. Однако любой достойный компилятор оптимизирует * 2 (или любое умножение на степень 2) для сдвига битов влево (когда сдвиг битов будет быстрее).
Если вы используете старый компилятор C, предпочтительнее использовать побитовый. Для удобства чтения вы можете прокомментировать свой код.
Для удобочитаемости значений, используемых в качестве битовых полей:
enum Flags { UP = (1<<0),
DOWN = (1<<1),
STRANGE = (1<<2),
CHARM = (1<<3),
...
, что, по моему мнению, предпочтительнее, чем '= 1, ..., = 2, ... = 4' или '= 1, ... = 2, = 2 * 2, ... = 2 * 3 ', особенно если у вас 8+ флагов.