2014-01-29 1 views
0

Я работаю над простым интерпретатором, чтобы узнать больше о том, как они работают.Работа с несколькими аргументами для интерпретатора

У меня есть пара аспектов, о которых я не уверен.

Как я должен иметь дело с кодами операций с различными аргументами?

я мог бы что-то вроде:

void execute(int opcode, int arg1, int arg2, int arg3, Machine m); 

Однако это:

-Limits me to 3 args 
-Forces me to supply dummy args for opcodes taking less args 

Каковы пути (ы), что переводчики обычно имеют дело с этим?

Я мог бы, конечно, нажать массив int, но мне интересно, есть ли лучший способ.

Thanks

ответ

1

Используйте обозначение varargs.

Определите метод как таковой:

void execute(int opcode, Machine m, int... args); 

и теперь вы можете работать с args как массив целых чисел (int[]).

Это означает, что все эти обозначения будут работать:

execute(opcode, m, arg1); 
execute(opcode, m, arg1, arg2); 
execute(opcode, m, arg1, arg2, arg3); 
execute(opcode, m, arg1, arg2, arg3, arg4); 

Важное замечание: если у вас есть два параметра одного и того же типа и один из них является переменные аргументы, то вам придется ставить с переменным числом аргументов за сингулярный один для предотвращения неоднозначности.

Как правильно указывает Эллиот: это должен быть последний параметр, когда есть другие.

+0

Одно уточнение, только последний аргумент может быть переменной длиной. –

+0

@ElliottFrisch: хорошая точка, я думал, что это имеет значение только с переменными того же типа. –

+0

Это может быть правдой на других языках. Другое примечание: varargs делает аргументы полностью необязательными ... так что 'execute (opcode, m);' также действителен. –

Смежные вопросы