Я знаю, что это уже давно, но я не был доволен другими ответами, которые я нашел здесь, поэтому я написал это:
me=$(basename $0)
TMP=$(mktemp -d /tmp/$me.XXXXXXXX)
echo
echo "building new repo in $TMP"
echo
sleep 1
set -e
cd $TMP
mkdir new-repo
cd new-repo
git init
cd ..
x=0
while [ -n "$1" ]; do
repo="$1"; shift
git clone "$repo"
dirname=$(basename $repo | sed -e 's/\s/-/g')
if [[ $dirname =~ ^git:.*\.git$ ]]; then
dirname=$(echo $dirname | sed s/.git$//)
fi
cd $dirname
git remote rm origin
git filter-branch --tree-filter \
"(mkdir -p $dirname; find . -maxdepth 1 ! -name . ! -name .git ! -name $dirname -exec mv {} $dirname/ \;)"
cd ..
cd new-repo
git pull --no-commit ../$dirname
[ $x -gt 0 ] && git commit -m "merge made by $me"
cd ..
x=$(( x + 1 ))
done
К сожалению, единственный ответ я могу придумать средства, увеличивающие сложность грамматики.
expr
в simple_expr
и expr_with_prefix
simple_expr
или (expr_with_prefix)
в ПРИМЕНЕНИИПервый шаг поворачивает Ваш уменьшать/уменьшать конфликт в смещать/уменьшать конфликт, но круглые скобки разрешают это.
Вы собираетесь иметь ту же проблему с 'b c': это a(b(c))
или (a(b))(c)
? Необходимо будет также прерваться applied_expression
и требуемый (applied_expression)
в грамматике.
Я думаю, что это сделает это, но я не уверен:
expr := INT
| parenthesized_expr
| expr MINUS expr
parenthesized_expr := ( expr )
| ( applied_expr )
| ( expr_with_prefix )
applied_expr := expr expr
expr_with_prefix := MINUS expr